Com o lançamento do macOS 10.14.5, a Apple adicionou um processo de Notarização obrigatório para aplicativos antes de distribuí-los. Gostaria de dizer o que é e quais dificuldades surgiram com esta atualização ao desenvolver no Electron.js.

1. Introdução
Dois anos após o boom do Electron.js, todos os holísticos quentes sobre o quão ruim é e por que é necessário são silenciosos. Não vamos reacendê-los nos comentários. Obrigada
Nosso projeto usa o electron-builder para criar a aplicação, mas para o empacotador de elétrons esse procedimento será aproximadamente o mesmo.
O projeto em si é um iniciador para jogos na nuvem, através do qual um cliente nativo é iniciado para acessar um computador remoto.
A assinatura de um aplicativo com o electron-builder não parece complicada, mas por uma questão de integridade, falarei brevemente sobre esse procedimento. Se você não tiver problemas para assinar o aplicativo, poderá pular este capítulo.
Assinatura do aplicativo
Para assinar o aplicativo, precisamos exportar certificados da conta pessoal do desenvolvedor da Apple. Vamos precisar de:
- Aplicativo de ID do desenvolvedor
- Instalador de ID do desenvolvedor
- * Aplicativo de desenvolvedor Mac de terceiros e instalador de desenvolvedor Mac de terceiros (se você planeja publicar o aplicativo na AppStore)
O certificado do Developer ID Installer é emitido para um aplicativo específico, pois esse bundleID é necessário. Para electron-builder, é especificado pelo parâmetro appId em package.json

Os certificados devem ser coletados em um único arquivo. Para fazer isso, adicione-os ao chaveiro (2 cliques no certificado).
Então vamos ao chaveiro, selecione os certificados necessários e clique em "exportar itens" no menu de contexto. Após a exportação, obtemos um arquivo com a extensão .p12.

Após o arquivo de certificado recebido, adicione as seguintes entradas às variáveis de ambiente
- CSC_LINK (caminho para o arquivo de certificado .p12)
- CSC_KEY_PASSWORD (senha de acesso ao certificado)
Se você não adicionar essas variáveis, o coletor procurará automaticamente as chaves adequadas no repositório de chaves. A adição dessas entradas permite identificar os certificados que você deseja usar para assinar.
Após essas operações, você pode iniciar o processo de construção e tudo deve ocorrer sem problemas.
Isso funcionou sem problemas até o lançamento do macOS 10.14.5 ....
O que mudou com o macOS 10.14.5
Uma pequena digressão. Realizando o último trabalho do novo patch à noite, decidi deixar a montagem da versão de produção pela manhã. Percebendo que uma atualização chegou no macOS, a lançou e foi dormir.
Na manhã seguinte, fiquei surpreso ao ver que o assembly cai devido a um erro desconhecido no momento da assinatura do aplicativo - "Unnotarized Developer ID".
Não adie até amanhã o que pode ser feito hoje. Benjamin Franklin
A essência do problema
A partir do macOS 10.14.5, a Apple introduziu um procedimento obrigatório de reconhecimento de firma. O primeiro artigo da Apple sobre isso foi em 2018, mas foi com esta atualização que esse procedimento se tornou obrigatório. Como ela é.
Você coleta o aplicativo -> envia para o servidor Apple -> Apple certifica -> Retorna o status da certificação bem-sucedida -> O comando para definir o selo de certificação é executado.
Para desenvolvedores no Xcode, você só precisa marcar o reconhecimento de firma

Além disso, o processo de reconhecimento de firma do aplicativo montado pode ser realizado por um comando no terminal.
$ xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip
- ID do pacote primário - ID do pacote do aplicativo
- nome de usuário - login do usuário developer.apple.com
- senha - "senha específica do aplicativo". Ele pode ser criado em sua conta pessoal appleid.apple.com sob a conta do desenvolvedor.
Se você não executar o procedimento de reconhecimento de firma, quando o usuário tentar instalar o aplicativo, uma janela com um erro trava. O Gatekeeper é responsável por verificar a segurança do aplicativo. Foi ele quem interrompeu a montagem do aplicativo no construtor de elétrons.

Como era o processo de construção do construtor de elétrons
Depois de criar o aplicativo no arquivo .app, usando o utilitário electron-osx-sign, o aplicativo foi assinado. Após assinar com o certificado, foi iniciado o processo de verificação do aplicativo com um gatekepper. Porém, com o lançamento da atualização, o gatekeeper começou a verificar o reconhecimento de firma correto do aplicativo, e isso não permitiu concluir com êxito o procedimento de assinatura do aplicativo.

Patch para reconhecimento de firma
O usuário do Github Kallin prontamente sugeriu uma solução, com a adição de dois novos parâmetros nas configurações. O primeiro é "gatekeeperAssess" - desativa a validação de montagem após a assinatura e o segundo é "sign" - que desativa a assinatura do arquivo de instalação (dmg) com um certificado. Este commit está incluído no release do electron-builder 20.43.0.
Para o processo de reconhecimento de firma em si, o electron-userland possui um módulo de reconhecimento de elétron que executa essa tarefa, basta escrever um pequeno script e executá-lo usando o gancho afterSign.
Processo de assinatura e reconhecimento de firma

Inicialmente, é necessário verificar se você instalou a versão electron-builder> = 20.43.0 e instalar o pacote electron-notarize.
Adicione 2 entradas às variáveis de ambiente:

Agora crie um script de reconhecimento de firma que será executado após a assinatura do aplicativo.
const notarize = require('electron-notarize').notarize; module.exports = async (context) => { const { electronPlatformName } = context; if (electronPlatformName === 'darwin') { try { console.log('Try notarize app'); await notarize({ appBundleId: 'APP_BUNDLE_ID', appPath: './dist/mac/APP_NAME.app', appleId: process.env.appleId, appleIdPassword: process.env.appleASP, }); console.log('Success notarize'); } catch (err) { console.log(err); } } };
Nós o salvamos em um local conveniente para você.
Além disso, para notarização adequada, precisamos determinar os direitos de acesso
recursos do sistema para nossa aplicação. Para fazer isso, crie o arquivo build / entitlements.mac.inherit.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.allow-dyld-environment-variables</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> <true/> <key>com.apple.security.cs.disable-executable-page-protection</key> <true/> <key>com.apple.security.cs.debugger</key> <true/> <key>com.apple.security.automation.apple-events</key> <true/> </dict> </plist>
O conteúdo do arquivo no meu caso. Pode haver uma configuração diferente para você. Descrição de todos os campos .
Obrigatório para Electron.js é - com.apple.security.cs.allow-unsigned-executable-memory.
Agora atualize as configurações em package.json
Na seção para macOS:

- gatekeeperAssess (desativa a validação de aplicativo no lado electron-osx-sign)
- hardenedRuntime (permite criar uma lista de permissões de segurança e acesso aos recursos do sistema)
- direitos (caminho para o arquivo de permissões de acesso para nosso aplicativo)
Na seção geral das configurações do construtor de elétrons:

- afterSign (caminho para o script de reconhecimento de firma, que será iniciado após a assinatura do aplicativo)
Iniciamos o processo de montagem. Pode parecer um pouco suspenso, mas transferir o arquivo para o servidor Apple e aguardar uma resposta leva algum tempo (de 3 a 10 minutos)
O status das notificações pode ser visualizado no terminal executando o comando:
$ xcrun altool --notarization-history 0 -u $appleId -p $appleASP
A resposta será apresentada em uma tabela. O campo de status pode ter o valor 'processo', 'aprovado', 'inválido'

Se o status for 'inválido', você poderá ver pelo número da solicitação o que exatamente deu errado.
$ xcrun altool --notarization-info "RequestUUID" -u $appleId
Esse é todo o processo de assinatura e reconhecimento de firma. Espero que você ache este artigo útil. Obrigada
Pequena adição
Ao transferir o aplicativo para teste, uma falha interessante foi descoberta. O pedido recebido através do Telegram simplesmente se recusou a iniciar. Ao visualizar os logs, descobriu-se que o aplicativo estava em quarentena pelo Telegram. Por qual motivo e como isso aconteceu, não consegui encontrar a resposta. Ao enviar um arquivo via Yandex.Disk (ou qualquer outra maneira de baixar por meio de um navegador), esse problema não ocorre.

Links úteis