Dev Journal – Automatize aplicativos mac OS com reconhecimento de firma

Zeplin Blocked Unblock Seguir Seguindo 9 de janeiro

Com o lançamento do macOS Mojave, a Apple introduziu um serviço notarial para validar aplicativos macOS que não são distribuídos pela App Store. Embora esse processo seja atualmente opcional, em um post publicado em outubro, a Apple anunciou que o Gatekeeper exigirá que o software seja autenticado em uma versão futura. Isso provavelmente significa que, em um futuro próximo, os usuários receberão um aviso ao iniciar aplicativos que não tenham reconhecimento de firma.

Ao contrário do processo manual de revisão de aplicativos, o serviço de reconhecimento de firma é um sistema automatizado que executa verificações comuns de segurança, verificação de conteúdo mal-intencionado, verificação de problemas de assinatura de código e assim por diante. Em comparação com as revisões tradicionais da App Store, leva apenas alguns minutos e os problemas são mais fáceis de avaliar. ?

O Xcode 10 introduziu um recurso interno para autenticar aplicativos na janela do Organizer. Para aprender mais sobre esse recurso, você pode seguir a documentação da Apple.

Notarizar aplicativos no Xcode é bastante útil, mas é uma tarefa manual. Se você estiver usando um ambiente de Integração Contínua como Bitrise, CircleCI ou Travis CI, ou simplesmente desejar simplificar esse processo, este post entrará em detalhes sobre como automatizar o reconhecimento de um aplicativo macOS usando ferramentas de linha de comando .

Também vamos introduzir um plugin de fastlane simplificando este processo em um one-liner , que nós abrimos recentemente. Você pode pular para a seção Notarizing via fastlane, se preferir aprender mais sobre isso.

Notarizing via Xcode Command Line Tools

Como uma alternativa ao recurso interno do Xcode, a Apple também fornece ferramentas de linha de comando para autenticar um aplicativo macOS. No entanto, este processo requer um punhado de etapas, principalmente usando ferramentas xcrun altool e xcrun stapler .

Upload para serviço notarial

Inicialmente, precisamos enviar o aplicativo construído para o serviço notarial. Não é possível fazer o upload de pacotes .app diretamente, pois eles são diretórios disfarçados. Podemos fazer o upload de um zip.

ferramenta de linha de comando zip deve fazer o truque aqui, mas geralmente preferimos ditto para compactar arquivos, uma vez que produz pacotes menores:

 ditto -c -k --rsrc --keepParent Exemplo.app Exemplo.app.zip 

?? Se você estiver enviando um .dmg, um pacote de instalação ou algo semelhante, você pode pular a etapa de compactação.

Para carregar o pacote, usaremos o subcomando --notarize-app do xcrun altool , que se parece com:

 xcrun altool --notarize-app -t osx -f Exemplo.app.zip --primary-bundle-id <Identificador do pacote> -u <nome de usuário do ID da Apple> -p <senha do ID da Apple> - xml no formato de saída 

Observe que também precisamos passar o identificador de pacote do aplicativo – que você pode ler no arquivo Info.plist, se necessário. Especificamente para ambientes de IC, provavelmente definiríamos a senha da ID da Apple como uma variável de ambiente secreta. Nesse caso, você pode passar o nome da variável de ambiente, em vez da senha:

 -p @ env: <nome da variável de ambiente> 

Se o upload for bem sucedido, este comando simplesmente retorna um identificador de solicitação . Como a operação de reconhecimento de firma continua na nuvem, podemos usar esse identificador para consultar o status.

Conforme especificado nos argumentos, a saída será retornada em um formato XML – mais especificamente em um formato de lista de propriedades. O identificador de solicitação que procuramos está localizado no objeto de notarization-upload , sob a chave RequestUUID .

Status de consulta da operação de reconhecimento de firma

Como a operação de reconhecimento de firma continua, agora precisamos consultar periodicamente o status usando xcrun altool :

 xcrun altool --notarization-info <Identificador de solicitação> -u <nome de usuário do ID da Apple> -p <senha do ID da Apple> - xml no formato de saída 

Da mesma forma, esse comando retorna uma lista de propriedades também. Dentro do objeto notarization-info , podemos alternar o campo Status para ver onde a operação está:

  • in progress : a operação ainda está em andamento, para que possamos consultar novamente mais tarde. Atualmente, para o aplicativo macOS de Zeplin, essa etapa leva cerca de 2 minutos, portanto, verificar novamente a cada minuto parece fazer sentido (por enquanto).
  • invalid : a notarização falhou devido a um ou vários problemas. Nesse caso, podemos fazer o download do log, que é um arquivo JSON com detalhes sobre todos os problemas. A URL do arquivo de log está localizada na saída do comando, sob a chave LogFileURL .
  • success : a notarização foi bem-sucedida. Neste caso, a Apple ainda recomenda ler o arquivo de log que acabamos de mencionar, pois pode haver alguns avisos.

Bilhete notarial de grampeamento

Agora que o aplicativo foi autenticado com sucesso, temos uma etapa final em que precisamos grampear o aplicativo com o tíquete. Isso é feito via xcrun stapler :

 grampeador xcrun exemplo.app 

Observe que precisamos grampear o pacote .app, não o zip. Então, após o grampeamento, precisaremos compactar o aplicativo novamente e estaremos prontos para distribuí-lo!

Notarização via fastlane

Estamos usando o fastlane há algum tempo para simplificar as tarefas de bootstrap, construção e implantação do Zeplin. O fastlane fornece ações para simplificar essas tarefas repetitivas. Os diferentes passos que discutimos acima fazem o processo de reconhecimento de firma um ajuste perfeito para ser uma ação fastlane personalizada .

Nas duas últimas semanas, estamos trabalhando em um plug-in de fastlane que apresenta uma ação de notarize :

zeplin / fastlane-plugin-notarize
plugin fastlane para notarizar um aplicativo macOS ?. Contribua para o desenvolvimento de zeplin / fastlane-plugin-notarize criando um… github.com

Depois de instalar o plug-in seguindo as instruções , adicionaremos essa linha ao Fastfile que invoca a ação notarize , após criar o aplicativo:

 notarize (pacote: app_path) 

… E é basicamente isso! Esta ação abrange todas as etapas de reconhecimento de firma acima mencionadas.

Você pode acompanhar o código Ruby para explorar como ele faz o upload do aplicativo e consulta o resultado periodicamente até que esteja completo. Em caso de sucesso, a ação também grampeia o aplicativo com o ticket de reconhecimento de firma e, em caso de falha, imprime o arquivo de registro listando todos os problemas.

Problemas de notarização comuns

Se você já distribuiu seu aplicativo macOS fora da App Store até o momento, depois de enviar seu aplicativo à Apple para reconhecimento de firma pela primeira vez, é provável que você se depare com um ou mais problemas. A Apple comunica esses problemas por meio de um arquivo de log semelhante a:

 { 
"archiveFilename": "Example.app",
"problemas": [
{
"message": "A assinatura do binário é inválida.",
"path": "Example.app/Contents/MacOS/Example",
"gravidade": "erro"
}
]
"jobId": "00000000-0000-0000-0000-000000000000",
"logFormatVersion": 1,
"status": "Inválido",
"statusSummary": "Arquivo contém erros críticos de validação",
"ticketContents": null,
"uploadDate": "2019-01-09T18: 23: 04Z"
}

Aqui estão alguns problemas comuns de notarização e como corrigi-los:

A assinatura não inclui um registro de data e hora seguro.

Atualmente, um registro de data e hora seguro só é incluído se você autenticar manualmente um aplicativo através do Xcode. Se você estiver usando ferramentas de linha de comando, provavelmente precisará adicionar --timestamp como um sinalizador de assinatura de código personalizado. Isso pode ser feito dentro das configurações de construção do seu projeto:

Como gerar um registro de data e hora seguro requer uma conexão com a Internet, você pode evitar esse sinalizador para a configuração de depuração.

O executável não tem o tempo de execução endurecido ativado.

A ativação do tempo de execução reforçado adiciona restrições de segurança ao seu aplicativo, permitindo que você solicite exceções específicas. O tempo de execução protegido pode ser ativado diretamente na guia Recursos, nas configurações do projeto:

O executável solicita o serviço com.apple.security.get-task-allow.

Quando você cria um novo projeto macOS, o Xcode inclui automaticamente o direito com.apple.security.get-task-allow que facilita a depuração em sistemas que usam o SIP. Na verdade, ao exportar manualmente e notarizar um aplicativo através do Xcode, esse direito é automaticamente removido. Se você estiver usando ferramentas de linha de comando, como mencionamos acima, você precisará desabilitar isso das configurações do seu projeto por configuração:

Da mesma forma, certifique-se de manter essa configuração ativada para a configuração de depuração, para poder depurar suas compilações.

Para obter uma lista de mais problemas de reconhecimento de firma, você pode conferir a documentação da Apple que mais cobre.