Signer et notariser Sidekicks pour macOS
Ce guide montre comment signer Sidekicks avec un certificat Developer ID et le faire notariser par Apple, pour qu'il s'ouvre sur n'importe quel Mac sans passer par Ouvrir quand même. Il suppose une adhésion payante à l'Apple Developer Program dont vous êtes le titulaire du compte (Account Holder : seul ce rôle peut créer un certificat Developer ID), un Mac Apple Silicon avec les outils de développement du projet (Développer l'application), et une release déjà construite comme le décrit RELEASING.fr.md.
- La partie A se fait une seule fois (compter 30 minutes).
- La partie B se fait à chaque release, après
make release-build, tant que la signature n'est pas automatisée (issue #58). Comptez 10 à 20 minutes, surtout de l'attente chez Apple.
Gardez une fenêtre du Terminal ouverte à la racine du dépôt.
Ce que font signature et notarisation
| Étape | Outil | Ce qu'elle apporte |
|---|---|---|
| Signer | codesign avec votre certificat Developer ID |
macOS sait qui a fait l'app et qu'elle n'a pas été modifiée |
| Runtime renforcé | codesign --options runtime |
exigé par Apple pour notariser |
| Notariser | xcrun notarytool |
Apple analyse l'app et délivre un « ticket » |
| Agrafer | xcrun stapler |
le ticket est collé à l'app et au .dmg : Gatekeeper l'accepte même hors ligne |
L'app et le .dmg sont signés, notarisés et agrafés. Le .zip contient l'app agrafée.
Partie A — une seule fois
A1. Relever votre Team ID
- Ouvrez developer.apple.com/account, section Membership details.
- Notez le Team ID (10 caractères, par exemple
AB12CD34EF).
A2. Créer le certificat Developer ID Application
Avec Xcode (le plus simple) :
- Ouvrez Xcode → Settings… → Accounts. S'il n'y est pas, cliquez sur +, choisissez Apple ID et connectez-vous avec l'adresse e-mail et le mot de passe de votre compte Apple Developer (l'Apple ID, pas le Team ID).
- Votre équipe apparaît sous le compte, avec son Team ID : sélectionnez-la, cliquez sur Manage Certificates….
- Cliquez sur + en bas à gauche, puis Developer ID Application.
Sans Xcode :
- Ouvrez Trousseaux d'accès → Assistant de certification → Demander un certificat à une autorité de certification…, indiquez votre adresse, cochez Enregistré sur le disque. Vous obtenez un fichier
.certSigningRequest. - Sur developer.apple.com/account/resources/certificates, choisissez Developer ID Application, profil G2 Sub-CA, envoyez le fichier de demande, puis téléchargez le certificat.
- Double-cliquez sur le fichier
.cer: il rejoint le trousseau session.
A3. Vérifier que le certificat est utilisable
security find-identity -v -p codesigning
Une ligne "Developer ID Application: Prénom Nom (AB12CD34EF)" doit apparaître. C'est votre identité de signature : copiez-la exactement, guillemets exclus.
Si elle manque, ou s'affiche avec CSSMERR_TP_NOT_TRUSTED, installez le certificat intermédiaire Developer ID - G2 depuis apple.com/certificateauthority, puis relancez la commande.
A4. Sauvegarder le certificat et sa clé
La clé privée n'existe que sur ce Mac : sans sauvegarde, une panne oblige à révoquer le certificat et à en refaire un.
- Dans Trousseaux d'accès, trousseau session, catégorie Mes certificats, dépliez Developer ID Application: … (la clé apparaît dessous).
- Sélectionnez le certificat, Fichier → Exporter les éléments…, format .p12, choisissez un mot de passe.
- Rangez le
.p12et son mot de passe dans votre gestionnaire de mots de passe. Ne le mettez jamais dans le dépôt.
A5. Créer un mot de passe d'application pour la notarisation
- Ouvrez account.apple.com, Connexion et sécurité → Mots de passe pour les apps.
- Créez-en un nommé
sidekicks-notaryet copiez-le (il ne sera plus affiché).
A6. Enregistrer le profil de notarisation dans le trousseau
xcrun notarytool store-credentials sidekicks-notary \
--apple-id "vous@example.com" \
--team-id "AB12CD34EF"
Collez le mot de passe d'application quand il est demandé. Vérifiez :
xcrun notarytool history --keychain-profile sidekicks-notary
Une liste (vide la première fois) s'affiche, sans erreur d'authentification.
A7. Définir les deux variables
Ajoutez à votre ~/.zshrc, puis ouvrez un nouveau Terminal :
export SIDEKICKS_SIGN_IDENTITY="Developer ID Application: Prénom Nom (AB12CD34EF)"
export SIDEKICKS_NOTARY_PROFILE="sidekicks-notary"
La partie B les utilise ; l'automatisation (issue #58) les utilisera aussi.
A8. Garder l'identifiant de l'app
CFBundleIdentifier vaut com.k33g.sidekicks dans build/darwin/Info.plist (et Info.dev.plist). Ne le changez plus : macOS y rattache les autorisations accordées à l'app.
Partie B — à chaque release
Ces commandes reprennent les paquets que make release-build vient de mettre dans dist/ et l'app restée dans bin/sidekicks.app.
B1. Construire la release
Comme d'habitude (RELEASING.fr.md, étapes Avant et 1) :
make release-build
B2. Signer l'app
xattr -cr bin/sidekicks.app
codesign --force --options runtime --timestamp \
--sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.app
codesign --verify --strict --verbose=2 bin/sidekicks.app
codesign -dv --verbose=4 bin/sidekicks.app 2>&1 | grep -E "Authority=Developer ID Application|flags=.*runtime|Timestamp="
La dernière commande doit afficher l'autorité Developer ID Application, le drapeau runtime et une ligne Timestamp.
B3. Notariser l'app et agrafer le ticket
ditto -c -k --keepParent bin/sidekicks.app /tmp/sidekicks-app.zip
xcrun notarytool submit /tmp/sidekicks-app.zip --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait
xcrun stapler staple bin/sidekicks.app
spctl -a -vvv -t exec bin/sidekicks.app
notarytool attend la réponse d'Apple (quelques minutes) et doit finir par status: Accepted. spctl doit dire accepted et source=Notarized Developer ID.
B4. Refaire le .dmg à partir de l'app agrafée, le signer, le notariser
wails3 task darwin:create:dmg
codesign --force --timestamp --sign "$SIDEKICKS_SIGN_IDENTITY" bin/sidekicks.dmg
xcrun notarytool submit bin/sidekicks.dmg --keychain-profile "$SIDEKICKS_NOTARY_PROFILE" --wait
xcrun stapler staple bin/sidekicks.dmg
spctl -a -vvv -t open --context context:primary-signature bin/sidekicks.dmg
spctl doit dire accepted et source=Notarized Developer ID.
B5. Remplacer les paquets macOS de dist/ et recalculer les sommes
names=($(scripts/package.sh names macos arm64)) # le .dmg, puis le .zip
mv bin/sidekicks.dmg "dist/${names[0]}"
rm -f "dist/${names[1]}" && ditto -c -k --keepParent bin/sidekicks.app "dist/${names[1]}"
(cd dist && rm -f SHA256SUMS && shasum -a 256 -- * > ../SHA256SUMS.tmp) && mv SHA256SUMS.tmp dist/SHA256SUMS
cat dist/SHA256SUMS
B6. Essayer sur un autre Mac
- Copiez le
.dmgsur un autre Mac (ou un autre compte utilisateur), par le web ou AirDrop : il doit porter l'attribut de quarantaine d'un vrai téléchargement. - Ouvrez-le, glissez sidekicks dans Applications, lancez-le : il s'ouvre directement, sans Ouvrir quand même.
- Faites le tour de ce que le runtime renforcé pourrait gêner : un agent local, un agent en conteneur ou en sbx, l'onglet Terminal, l'ouverture d'un fichier, le glisser-déposer, Settings → Open….
B7. Taguer et publier
Suivez la suite de RELEASING.fr.md (étapes 2 à 4) : les fichiers à attacher sont ceux de dist/.
Variantes
- Release macOS à part, sur une version déjà publiée (par exemple
v1.0.0-macos, issue #57) : ne changez pasinfo.version(l'app reste la1.0.0; Windows refuse une version qui n'est pas faite de nombres, Apple aussi pourCFBundleShortVersionString, et les paquets s'appelleraient…-1.0.0-macos-macos-…). Construisez seulement macOS avecSKIP=windows make release-build, faites la partie B, puis créez le tag à la main :git tag -a v1.0.0-macos -m "Sidekicks 1.0.0, macOS signé et notarisé" && git push origin v1.0.0-macos. Le workflow Release démarre et s'arrête à sa vérification (le tag n'est pasv+ la version debuild/config.yml) : c'est attendu. Créez la release sur Rickub depuis ce tag et attachez le.dmg, le.zipetSHA256SUMS. Vous pouvez aussi simplement remplacer les fichiers macOS de la releasev1.0.0. - La notarisation est refusée (
status: Invalid) :xcrun notarytool log <id> --keychain-profile "$SIDEKICKS_NOTARY_PROFILE"donne la raison. Les plus courantes : signature sans--options runtimeou sans--timestamp, ou un fichier non signé dans l'app. codesignrefuse (« resource fork, Finder information, or similar detritus ») : le dépôt est dans un dossier synchronisé, qui ajoute des métadonnées.xattr -cr bin/sidekicks.apppuis recommencez ; si cela revient, copiez l'app dans/tmpet signez-la là.- L'app signée ne démarre pas ou une fonction ne marche plus : le runtime renforcé bloque quelque chose. Lisez Console.app au lancement ; si un droit précis manque, ajoutez un fichier d'entitlements (
--entitlements build/darwin/entitlements.plistdans B2) avec seulement ce droit, et notez-le dans l'issue #57. - Vérifier une app installée :
spctl -a -vvv /Applications/sidekicks.appetxcrun stapler validate /Applications/sidekicks.app. - Un autre Mac pour construire : importez le
.p12(double-clic), puis refaites A6 et A7.
Voir aussi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
|