Avec la sortie de macOS 10.14.5, Apple a ajouté un processus de notarisation obligatoire pour les applications avant de les distribuer. Je voudrais vous dire de quoi il s'agit et quelles difficultés sont survenues avec cette mise à jour lors du développement sur Electron.js.

Présentation
2 ans après le boom d'Electron.js, tous les holivars chauds sur la façon dont elle est mauvaise et pourquoi elle est nécessaire sont silencieux. Ne les rallumons pas dans les commentaires. Je vous remercie
Notre projet utilise un générateur d'électrons pour créer l'application, mais pour l'électron-emballeur, cette procédure sera à peu près la même.
Le projet lui-même est un lanceur pour les jeux en nuage, à travers lequel un client natif est lancé pour accéder à un ordinateur distant.
La signature d'une candidature avec électron-constructeur ne semble pas compliquée, mais pour être complet, je vais parler brièvement de cette procédure. Si vous n'avez aucun problème à signer l'application, vous pouvez ignorer ce chapitre.
Signature d'application
Pour signer l'application, nous devons exporter les certificats depuis le compte personnel du développeur Apple. Nous aurons besoin de:
- Développeur ID Application
- Développeur ID Installer
- * Application de développeur Mac tiers et programme d'installation de développeur Mac tiers (si vous prévoyez de publier l'application dans l'AppStore)
Le certificat Developer ID Installer est émis pour une application spécifique, pour ce bundleID est requis. Pour électron-builder, il est spécifié par le paramètre appId dans package.json

Les certificats doivent être collectés dans un seul fichier. Pour ce faire, ajoutez-les au trousseau (2 clics sur le certificat).
Ensuite, nous allons au trousseau, sélectionnez les certificats nécessaires et cliquez sur "Exporter les éléments" dans le menu contextuel. Après l'exportation, nous obtenons un fichier avec l'extension .p12.

Après le fichier de certificat reçu, ajoutez les entrées suivantes aux variables d'environnement
- CSC_LINK (chemin d'accès au fichier de certificat .p12)
- CSC_KEY_PASSWORD (mot de passe d'accès au certificat)
Si vous n'ajoutez pas ces variables, le collecteur recherchera automatiquement les clés appropriées dans le référentiel de trousseaux. L'ajout de ces entrées vous permet de localiser les certificats que vous souhaitez utiliser pour la signature.
Après ces opérations, vous pouvez démarrer le processus de construction et tout devrait se dérouler sans problème.
Cela a fonctionné en douceur jusqu'à la sortie de macOS 10.14.5 ....
Ce qui a changé avec macOS 10.14.5
Une petite digression. Réalisant le dernier travail sur le nouveau patch de nuit, j'ai décidé de quitter l'assemblage de la version de production dans la matinée. Remarquant qu'une mise à jour est arrivée sur macOS, elle l'a lancée et s'est mise en veille.
Le lendemain matin, j'ai été surpris de voir que l'assemblage tombe d'une erreur inconnue au moment de la signature de l'application - "Unnotarized Developer ID".
Ne remettez à demain que ce qui peut être fait aujourd'hui. Benjamin Franklin
L'essence du problème
Depuis macOS 10.14.5, Apple a introduit une procédure de notarisation obligatoire. Le premier article d'Apple à ce sujet date de 2018, mais c'est avec cette mise à jour que cette procédure est devenue obligatoire. À quoi ressemble-t-elle.
Vous récupérez l'application -> l'envoyez au serveur Apple -> Apple la certifie -> Renvoie l'état de la certification réussie -> La commande pour définir le cachet de certification est exécutée.
Pour les développeurs sur Xcode, il vous suffit de cocher la notarisation

Aussi, le processus de notarisation de l'application assemblée peut être effectué par une commande dans le 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
- primary-bundle-id - bundleID d'application
- nom d'utilisateur - login utilisateur developer.apple.com
- mot de passe - "mot de passe spécifique à l'application". Il peut être créé dans votre compte personnel appleid.apple.com sous le compte du développeur.
Si vous n'effectuez pas la procédure de notarisation, alors lorsque l'utilisateur essaie d'installer l'application, une fenêtre avec une erreur vole. Gatekeeper est chargé de vérifier la sécurité de l'application. C'est lui qui a cassé l'assemblage de l'application sur le générateur d'électrons.

À quoi ressemblait le processus de construction du générateur d'électrons
Après avoir créé l'application dans le fichier .app, à l'aide de l'utilitaire électron-osx-sign, l'application a été signée. Après avoir signé avec le certificat, le processus de vérification de l'application avec un gatekepper a été lancé. Mais avec la publication de la mise à jour, le portier a commencé à vérifier la bonne notarisation de l'application, ce qui n'a pas permis de mener à bien la procédure de signature de l'application.

Patch pour la notarisation
L'utilisateur de Github Kallin a rapidement suggéré une solution, avec l'ajout de deux nouveaux paramètres aux paramètres. Le premier est "gatekeeperAssess" - désactive la validation de l'assembly après la signature, et le second est "sign" - qui désactive la signature du fichier d'installation (dmg) avec un certificat. Cette validation est incluse dans la version du générateur d'électrons 20.43.0.
Pour le processus de notarisation lui-même, electron-userland possède un module de notarisation d'électrons qui effectue cette tâche, il vous suffit d'écrire un petit script et de l'exécuter à l'aide du crochet afterSign.
Processus de signature et de notarisation des applications

Au départ, vous devez vérifier que vous avez installé la version du générateur d'électrons> = 20.43.0 et installer le package electron-notarize.
Ajoutez 2 entrées aux variables d'environnement:

Créez maintenant un script de notarisation qui sera exécuté après la signature de l'application.
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); } } };
Nous l'enregistrons dans un endroit qui vous convient.
De plus, pour une bonne notarisation, nous devons déterminer les droits d'accès
aux ressources système pour notre application. Pour ce faire, créez le fichier build / droitements.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>
Le contenu du dossier dans mon cas. Il peut y avoir une configuration différente pour vous. Description de tous les champs .
Obligatoire pour Electron.js est - com.apple.security.cs.allow-unsigned-executable-memory.
Maintenant, mettez à jour les paramètres dans package.json
Dans la section pour macOS:

- gatekeeperAssess (désactive la validation de l'application côté signe électron-osx)
- hardenedRuntime (permet de créer une liste d'autorisations de sécurité et d'accès aux ressources système)
- habilitations (chemin d'accès au fichier des autorisations d'accès pour notre application)
Dans la section générale des paramètres du générateur d'électrons:

- afterSign (chemin vers le script de notarisation, qui sera lancé après la signature de l'application)
Nous commençons le processus d'assemblage. Cela peut sembler un peu suspendu, mais le transfert du fichier vers le serveur Apple et l'attente d'une réponse prennent un certain temps (de 3 à 10 minutes)
L'état des notifications peut être consulté dans le terminal en exécutant la commande:
$ xcrun altool --notarization-history 0 -u $appleId -p $appleASP
La réponse sera présentée dans un tableau. Le champ d'état peut avoir la valeur «processus», «approuvé», «non valide»

Si le statut est «invalide», vous pouvez voir par le numéro de la demande ce qui s'est exactement passé.
$ xcrun altool --notarization-info "RequestUUID" -u $appleId
C'est tout le processus de signature et de notarisation. J'espère que cet article vous sera utile. Je vous remercie
Petit ajout
Lors du transfert de l'application pour les tests, un problème intéressant a été découvert. La demande reçue par Telegram a simplement refusé de commencer. Lors de l'affichage des journaux, il a été découvert que l'application était mise en quarantaine par Telegram. Pour quelle raison et comment cela s'est produit, je n'ai pas pu trouver la réponse. Lors de l'envoi d'un fichier via Yandex.Disk (ou tout autre moyen de téléchargement via un navigateur), ce problème ne se produit pas.

Liens utiles