Archivé: Je ne fais malheureusement plus d'utilisation active de ce projet et je ne l'ai pas correctement maintenu depuis le début de 2022. Je souhaite la bienvenue à quiconque à Fork et à reprendre ce projet.
Gon est un outil simple sans fioritures pour signer et notariser vos binaires CLI pour macOS. GON est disponible en CLI qui peut être exécuté manuellement ou dans des pipelines d'automatisation. Il est également disponible en tant que bibliothèque Go pour l'intégration dans des projets écrits en Go. Gon peut signer et notariser des binaires écrits dans n'importe quelle langue.
En commençant par MacOS Catalina (10.15), Apple nécessite que tous les logiciels distribués en dehors du Mac App Store soient signés et notariés. Le logiciel qui n'est pas correctement signé ou notarié sera affiché un message d'erreur avec la seule option exploitable étant de "passer à Bin". Le logiciel ne peut pas être exécuté même à partir de la ligne de commande. Les solutions de contournement sont douloureuses pour les utilisateurs. Gon vous aide à automatiser le processus de notarisation.
Voir la feuille de route pour les fonctionnalités que nous voulons soutenir mais pas encore.
L'exemple ci-dessous exécute gon contre lui-même pour générer un zip et un DMG.

La façon la plus simple d'installer gon est via Homebrew:
$ brew install mitchellh/gon/gon
Vous pouvez également télécharger la version appropriée de votre plate-forme à partir de la page des versions. Ceux-ci sont tous signés et notariés pour sortir de la boîte sur MacOS 10.15+.
Vous pouvez également compiler à partir de Source en utilisant GO 1.13 ou ultérieure à l'aide de Standard go build . Veuillez vous assurer que les modules GO sont activés.
gon nécessite un fichier de configuration qui peut être spécifié sous forme de chemin de fichier ou transmis via STDIN. La configuration spécifie tous les paramètres gon utilisera pour signer et emballer vos fichiers.
GON doit être exécuté sur une machine macOS avec Xcode 11.0 ou version ultérieure. La signature de code, la notarisation et l'emballage nécessitent tous des outils qui ne sont disponibles que sur les machines macOS.
$ gon [flags] [CONFIG]
Une fois exécuté, gon signera, package et notons les fichiers configurés dans les formats demandés. gon sortira avec un code de sortie 0 sur le succès et toute autre valeur de l'échec.
Avant d'utiliser gon , vous devez acquérir un certificat d'identification du développeur. Pour ce faire, vous pouvez le faire via le Web ou via Xcode localement sur un Mac. L'utilisation de Xcode est plus facile si vous l'avez déjà installée.
Via le Web:
Connectez-vous à Developer.apple.com avec des informations d'identification Apple ID valides. Vous devrez peut-être vous inscrire à un compte de développeur Apple.
Accédez à la page des certificats.
Cliquez sur l'icône "+", sélectionnez "Application ID de développeur" et suivez les étapes.
Après avoir téléchargé le certificat, double-cliquez pour l'importer dans votre trousseau. Si vous construisez sur une machine CI, chaque machine CI doit avoir ce certificat dans leur trousseau.
Via xcode:
Ouvrez Xcode et accédez à Xcode => Préférences => Comptes
Cliquez sur "+" en bas à gauche et ajoutez votre ID Apple si vous ne l'avez pas déjà fait.
Sélectionnez votre compte Apple et cliquez sur "Gérer les certificats" dans le coin inférieur droit.
Cliquez sur "+" dans le coin inférieur gauche et cliquez sur "Developer ID Application".
Cliquez avec le bouton droit sur le certificat nouvellement créé dans la liste, cliquez sur "Exporter" et exportez le fichier en tant que certificat de format P12. Enregistrez ceci quelque part . Vous ne pourrez plus jamais le télécharger.
Pour vérifier que vous l'avez fait correctement, vous pouvez inspecter votre trousseau:
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities foundVous devriez voir un ou plusieurs certificats et au moins un devrait être votre certificat de demande de demande de développement. Le préfixe de chaîne hexadécimal est la valeur que vous pouvez utiliser dans votre fichier de configuration pour spécifier l'identité.
Le fichier de configuration peut spécifier des listes d'autorisation / refuser des licences pour les rapports, les remplacements de licence pour des dépendances spécifiques, etc. Le format de fichier de configuration est HCL ou JSON.
Exemple:
source = [ " ./terraform " ]
bundle_id = " com.mitchellh.example.terraform "
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
provider = " UL304B4VGY "
}
sign {
application_identity = " Developer ID Application: Mitchell Hashimoto "
}
dmg {
output_path = " terraform.dmg "
volume_name = " Terraform "
}
zip {
output_path = " terraform.zip "
}{
"source" : [ " ./terraform " ],
"bundle_id" : " com.mitchellh.example.terraform " ,
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD " ,
"provider" : " UL304B4VGY "
},
"sign" :{
"application_identity" : " Developer ID Application: Mitchell Hashimoto "
},
"dmg" :{
"output_path" : " terraform.dmg " ,
"volume_name" : " Terraform "
},
"zip" :{
"output_path" : " terraform.zip "
}
}Configurations prises en charge:
source ( array<string> ) - Une liste de fichiers à signer, à package et à notariser. Si vous souhaitez signer plusieurs fichiers avec différentes identités ou dans différents packages, vous devez invoquer gon avec des configurations distinctes. Ceci est facultatif si vous utilisez le mode notarisation uniquement avec le bloc notarize .
bundle_id ( string ) - L'ID de bundle pour votre application. Vous devez choisir quelque chose d'unique pour votre application. Vous pouvez également les enregistrer avec Apple. Ceci est facultatif si vous utilisez le mode notarisation uniquement avec le bloc notarize .
apple_id - Paramètres liés à l'ID Apple à utiliser pour la notarisation.
username ( string ) - Le nom d'utilisateur Apple ID, généralement une adresse e-mail. Cela va par défaut à la variable AC_USERNAME Environment si elle n'est pas définie.
password ( string ) - Le mot de passe de l'ID Apple associé. Cela peut être spécifié directement ou en utilisant @keychain:<name> ou @env:<name> pour éviter de mettre le mot de passe en clair directement dans un fichier de configuration. La syntaxe @keychain:<name> chargera le mot de passe à partir du clés macOS avec le nom donné. La syntaxe @env:<name> chargera le mot de passe de la variable environnementale nommée. Si cette valeur n'est pas définie, nous tenterons d'utiliser la variable d'environnement AC_PASSWORD par défaut.
Remarque : Si vous avez activé 2FA, le mot de passe doit être un mot de passe d'application, pas votre mot de passe Apple ID normal. Voir le dépannage pour plus de détails.
provider ( string ) - Le fournisseur de connexion App Store lors de l'utilisation de plusieurs équipes dans l'App Store Connect. Si ce n'est pas défini, nous tenterons de lire la variable d'environnement AC_PROVIDER par défaut.
sign - Paramètres liés à la signature des fichiers.
application_identity ( string ) - Le nom ou l'ID du certificat "Developer ID Application" à utiliser pour signer des applications. Cela accepte toute valeur valide pour l'indicateur -s pour le binaire codesign sur macOS. Voir man codesign pour une documentation détaillée sur les valeurs acceptées.
entitlements_file ( string Facultatif ) - Le chemin complet vers un fichier de format PLIST. Entrée, utilisé pour l'argument --entitlements à codesign
dmg ( Facultatif ) - Paramètres liés à la création d'une image disque (DMG) en tant que sortie. Cela ne sera créé que si cela est spécifié. Le DMG disposera également du billet de notarisation agrafée afin qu'il puisse être vérifié hors ligne et ne nécessite pas d'Internet.
output_path ( string ) - le chemin pour créer l'archive zip. Si ce chemin existe déjà, il sera écrasé. Tous les fichiers dans source seront copiés dans la racine de l'archive zip.
volume_name ( string ) - Le nom du DMG monté qui apparaît dans Finder, le chemin de fichier monté, etc.
zip ( facultatif ) - Paramètres liés à la création d'une archive zip en tant que sortie. Une archive zip ne sera créée que si celle-ci est spécifiée. Notez que les archives zip ne prennent pas en charge l'agrafage, ce qui signifie que les fichiers au sein de l'archive zip notarié nécessiteront une connexion Internet pour vérifier la première utilisation.
output_path ( string ) - le chemin pour créer l'archive zip. Si ce chemin existe déjà, il sera écrasé. Tous les fichiers dans source seront copiés dans la racine de l'archive zip.Mode notarisation uniquement:
notarize ( Facultatif ) - Paramètres pour Notarizer des fichiers déjà construits. Ceci est une alternative à l'utilisation de l'option source . Cette option peut être répétée pour notariser plusieurs fichiers.
path ( string ) - Le chemin du fichier vers Notarize. Cela doit être l'un des types de fichiers pris en charge d'Apple pour la notarisation: DMG, PKG, APP ou ZIP.
bundle_id ( string ) - L'ID de bundle à utiliser pour cette notarisation. Ceci est utilisé à la place du bundle_id de niveau supérieur (qui contrôle la valeur des exécutions basées sur la source).
staple ( bool FORPATIONNEL ) - Contrôles Si stapler staple doit s'exécuter si la notarisation réussit. Cela ne devrait être défini que pour les filetypes qui le prennent en charge (DMG, PKG ou APP).
Vous pouvez configurer gon pour notariser des fichiers déjà signés. Ceci est utile si vous intégrez gon dans un pipeline de construction existant qui peut déjà prendre en charge la création de fichiers PKG, App, etc.
Parce que la notarisation nécessite que la charge utile des packages soit également signée, ce mode suppose que vous avez codésigné la charge utile ainsi que le package lui-même. gon ne signera pas votre package dans les blocs notarize . Veuillez ne pas confondre cela avec quand source est définie et gon lui-même crée vos packages, auquel cas il les signera également.
Vous pouvez également l'utiliser en plus de spécifier source . Dans ce cas, nous coderons et emballerons les fichiers spécifiés dans source , puis notarisez ces résultats ainsi que ceux des blocs notarize .
Exemple dans HCL puis la configuration identique dans JSON:
notarize {
path = " /path/to/terraform.pkg "
bundle_id = " com.mitchellh.example.terraform "
staple = true
}
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
}{
"notarize" : [{
"path" : " /path/to/terraform.pkg " ,
"bundle_id" : " com.mitchellh.example.terraform " ,
"staple" : true
}],
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD "
}
} Remarque Vous pouvez spécifier plusieurs blocs notarize pour Notariser les fichiers multipliés simultanément.
Le processus de notarisation nécessite de soumettre votre (s) package à Apple et d'attendre qu'ils les scannent. Apple ne fournit pas de SLA public pour autant que je sache.
En développant gon et en travaillant avec le processus de notarisation, j'ai trouvé que le processus était rapide en moyenne (<10 minutes) mais dans certains cas, les demandes de notarisation ont été en file d'attente pendant une heure ou plus.
gon publiera les mises à jour d'état au fur et à mesure et attendra indéfiniment pour que la notarisation soit terminée. Si gon est interrompu, vous pouvez vérifier l'état d'une demande vous-même en utilisant la demande UUID que gon sortira après la soumission.
gon est conçu pour prendre en charge l'exécution dans des environnements automatisés tels que les pipelines CI. Dans cet environnement, vous devez utiliser des fichiers de configuration JSON avec gon et l'indicateur -log-json pour obtenir une sortie de journalisation structurée.
gon sort toujours une sortie lisible par l'homme sur STDOUT (y compris les erreurs) et toutes les sorties de journal sur STDERR. En spécifiant -log-json les entrées de journal seront structurées avec JSON. Vous pouvez traiter le flux de JSON à l'aide d'un outil tel que jq ou n'importe quel langage de script pour extraire des informations critiques telles que la demande UUID, le statut, etc.
Lorsque gon est exécuté dans un environnement sans Tty, la sortie humaine ne sera pas colorée. Cela le rend plus convivial pour les journaux de sortie.
Exemple:
$ gon -log-level=info -log-json ./config.hcl
...
Remarque Vous devez spécifier à la fois -log-level et -log-json . L'indicateur -log-level permet la journalisation en général. Un niveau info est suffisant dans les environnements d'automatisation pour obtenir toutes les informations que vous souhaitez.
En première course peut être invité plusieurs fois pour les mots de passe. Si vous cliquez sur "toujours autoriser", vous ne serez plus invité. Ces invites proviennent du logiciel Apple que gon sous-traite, et non de gon lui-même.
Je ne sais pas actuellement comment scénorer les approbations, donc la recommandation sur les machines de construction est d'exécuter gon manuellement une fois. Si quelqu'un trouve un moyen d'automatiser cela, veuillez ouvrir un problème, faites-le moi savoir, et je mettrai à jour cette lecture.
GoreleSer est un outil d'automatisation de version complet populaire pour les projets basés sur GO. GON peut être utilisé avec GoreleSer pour augmenter l'étape de signature pour notariser vos binaires dans le cadre d'un pipeline de GoreleSer.
Voici un exemple de configuration de GoreleSer pour signer vos binaires:
builds :
- binary : foo
id : foo
goos :
- linux
- windows
goarch :
- amd64
# notice that we need a separated build for the macos binary only:
- binary : foo
id : foo-macos
goos :
- darwin
goarch :
- amd64
signs :
- signature : " ${artifact}.dmg "
ids :
- foo-macos # here we filter the macos only build id
# you'll need to have gon on PATH
cmd : gon
# you can follow the gon docs to properly create the gon.hcl config file:
# https://github.com/mitchellh/gon
args :
- gon.hcl
artifacts : allPour en savoir plus, consultez la documentation de GoreleSer.
Nous exposons également une API prise en charge pour la signature, l'emballage et la notariation des fichiers à l'aide du langage de programmation Go. Veuillez consulter la documentation GO liée pour plus de détails.
Les bibliothèques exposées sont des niveaux inférieurs délibérément inférieurs et séparent les étapes du signe, du package, de la notarisation et de l'agrafage. Cela vous permet d'intégrer cette fonctionnalité dans tous les outils facilement par rapport à une expérience gon -CLI opinionnée.
Vous avez probablement activé Apple 2FA. Vous devrez générer un mot de passe d'application et l'utiliser au lieu de votre mot de passe Apple ID.
Ce sont certaines choses que j'aimerais voir mais ne sont pas actuellement implémentées.