À partir de macOS Sierra, je ne peux plus importer une identité de code-code dans un trousseau contenant/usr/bin/security sans que l'utilisateur ne soit invité par l'interface utilisateur usr/bin/codesign à accéder à cette identité. Cela casse les scripts d'empaquetage du serveur de génération. Il semble n'y avoir aucune solution de contournement. Cela concerne les trousseaux personnalisés créés, mais également le login.keychain.
Étapes pour reproduire: Exécutez les commandes suivantes dans Terminal (nécessite qu'une identité de signature soit disponible pour l'importation):
security create-keychain -p test buildagent.keychain
security unlock-keychain -p test buildagent.keychain
security list-keychains -d user -s buildagent.keychain
security default-keychain -s buildagent.keychain
security import identity.p12 -k buildagent.keychain -P password -T /usr/bin/codesign
codesign -vfs '$IDENTITY' '${PRODUCT}' --keychain 'buildagent.keychain'
Résultat: macOS affiche une invite d'interface utilisateur demandant l'autorisation d'accéder à la clé privée précédemment importée.
J'ai essayé plusieurs solutions de contournement, mais rien ne semble fonctionner:
L'importation de l'identité fonctionne définitivement, je peux voir le CERT et la clé lors de l'affichage du contenu du trousseau dans l'application Keychain Access. Le paramètre de contrôle d'accès de la clé privée est également correctement configuré (avec la règle d'exception de codeign souhaitée).
Comment puis-je éviter l'invite d'interface utilisateur de Sierra?
La commande que vous devez utiliser est la suivante:
security set-key-partition-list -S Apple-tool:,Apple: -s -k keychainPass keychainName
N'oubliez pas que cet outil de ligne de commande fonctionne comme le mode de modification des list-keychains. Si vous exécutez set-key-partition-list avec une valeur unique, tous les ID de partition contenus dans les certificats seront écrasés. Cela ne validera pas les valeurs passées.
Cette commande définit les identificateurs de partition (les éléments après -S séparés par une virgule) pour les clés pouvant signer (-s) pour un trousseau spécifique. Le partitionID actuel qui autorise la codification est Apple:
.
Je ne sais pas quoi Apple-tool:
fait comme ce n’est pas documenté, mais il était là après avoir importé la clé avec security import
donc je le garde pour éviter de briser les personnes qui copient-collent la commande.
Cette modification a été introduite avec Mac OS Sierra et n’est pas documentée (ou du moins, je n’ai pas trouvé de documentation). À partir du 16 octobre, la page de manuel relative à la sécurité ne répertorie toujours pas cette commande.
Pour plus d'informations, vous pouvez vous référer à ce rapport de bogue - http://www.openradar.me/28524119
Pour ceux qui rencontrent ce problème avec Travis ou un autre CI, vous devez ajouter codesign
dans la liste des identifiants d’application.
security set-key-partition-list -S Apple-tool:,Apple:,codesign: -s -k keychainPass keychainName
P.S: J'utilise keychainName.keychain (en ajoutant .keychain
)
La commande de cette réponse n'a déverrouillé le trousseau que pour moi, mais j'avais toujours l'invite d'interface utilisateur qui demandait si l'application en cours pouvait utiliser la clé.
J'ai empêché l'invite comme ceci:
Accédez au trousseau dans Accès au trousseau, double-cliquez sur toutes les clés et, dans l'onglet Contrôle d'accès, cochez la case "Autoriser toutes les applications à accéder à cet élément".
J'ai ensuite été en mesure de télécharger le nouveau fichier de trousseau sur mon serveur de génération Jenkins, où il est déverrouillé par le plug-in de profils de provisioning et de porte-clés . La construction réussit maintenant la signature.
Pour une raison quelconque, le security set-key-partition-list
N'a pas travaillé pour moi.
Je l'ai résolu en utilisant l'option -A lors de l'importation du certificat dans le trousseau:
security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A
Il n'est pas nécessaire d'utiliser le security set-key-partition-list
ensuite.
Cette option permet à n'importe quelle application d'accéder à la clé importée sans avertissement. Par conséquent, cela empêche l'invite de se présenter. Notez qu’elle n’est pas sécurisée, car la clé n’est pas protégée mais, en fonction de votre contexte de construction, elle peut être utile.
En plus de cela, le trousseau doit être ajouté à la liste de recherche:
security list-keychains -s ${KEYCHAIN_PATH}
Ensuite, le trousseau devrait être déverrouillé. Sinon, une invite demandant le mot de passe du trousseau sera affichée:
security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH}
Finalement, le délai de verrouillage automatique devrait être désactivé. C'est dans le cas où la construction est assez longue et que le trousseau se re-verrouille:
security set-keychain-settings ${KEYCHAIN_PATH}
Après avoir essayé de nombreuses solutions différentes, ce qui a fonctionné pour moi était tout simplement de changer le mot de passe de mon trousseau.