Nœuds de distribution · Signeur dédié · Rotation des profils · Périmètre Trousseau · Matrice de décision
Les responsables mobile et plateforme qui exploitent un maillage Mac distant multi-nœuds rencontrent souvent « l’archive signe ici, la CI échoue au provisioning là-bas » : les fenêtres de rotation dérivent, les certificats de distribution atterrissent sur des disques partagés, ou chaque exécuteur importe son propre .p12 et le contexte d’équipe diverge. Cet article compare signeur dédié, identités par exécuteur et distribution contrôlée, détaille le mappage profil vers bundle avec règles de rotation et d’idempotence, ajoute un guide en six étapes et se termine par une matrice taille, conformité et cadence de release. Les liens vers la liste Golden Image et dérive, les exécuteurs du pool de build partagé et OIDC et secrets à courte durée maintiennent le contexte de signature aligné sur les lots d’outils.
Vous avez suivi la checklist Golden Image et voyez encore errSecInternalComponent ou des incohérences de provisioning sur le maillage. La cause racine est en général que le contexte de signature n’est jamais devenu une métadonnée pipeline de premier ordre : UUID de profil, identifiant d’équipe, empreintes de certificat et périmètre Trousseau doivent être aussi auditables que IMAGE_ID. Avec un pool de build partagé, laisser les exécuteurs importer des paquets .p12 arbitraires casse à la fois la conformité et le diagnostic.
Fenêtres de rotation : après mise à jour des profils côté Apple Developer, d’anciens UUID subsistent sur certains nœuds et les échecs semblent aléatoires ; épingler des versions de manifeste explicites plutôt que « télécharger le dernier ».
Dispersion des certificats de distribution : un .p12 copié sur de nombreux hôtes du maillage signifie qu’une révocation arrête tout et que les audits ne peuvent pas dire qui a importé la clé privée où.
Dérive du périmètre Trousseau : trousseaux de session et système plus politique de déverrouillage incohérente pour l’utilisateur CI font manquer par intermittence les identités en signature sans tête.
Erreurs de mappage multi-identifiants d’application : les extensions utilisent un provisioning différent de l’app hôte alors que PROVISIONING_PROFILE_SPECIFIER est codé en dur une seule fois dans les arguments xcodebuild.
Profils mélangés aux caches de build : stocker les profils à côté de DerivedData dans des arbres « sûrs à effacer » fait que les nettoyeurs les suppriment la nuit.
Ajoutez ces cinq points à l’ordre d’astreinte comme « couche signature avant couche compilateur » pour réduire les tentatives inutiles. La latence humaine sur les transferts amplifie l’attente ; croisez avec la checklist SSH contre VNC pour décider qui peut valider les invites Trousseau sur un hôte signeur.
Aucune topologie ne gagne partout : alignez rayon de blast de révocation, preuves de conformité et élasticité du maillage. Les signeurs dédiés minimisent la surface exposée mais créent des files ; les clés par exécuteur montent en parallélisme mais explosent le coût d’audit ; la distribution contrôlée se situe entre les deux et exige manifeste et montages en lecture seule. Même leçon que pour OIDC et coffres de secrets : le matériel de clé privée doit suivre la durée de vie la plus courte et l’exposition la plus faible.
| Dimension | Signeur dédié | Identité par exécuteur | Distribution contrôlée |
|---|---|---|---|
| Rayon de révocation | Le plus petit ; rotations bornées | Le plus grand ; traçage par hôte | Moyen ; versions de manifeste |
| File et élasticité du maillage | Risque de goulot ; réservation ou export sidecar | Forte concurrence | Moyenne-haute ; récupération de profils en parallèle |
| Audit de conformité | Le plus simple ; accès et export journalisés | Le plus difficile ; clés dispersées | Moyen ; prouver l’immuabilité des montages |
| Couplage Golden Image | Le signeur peut suivre son propre lot | Les certificats dérivent des identifiants d’image | La révocation de profil appartient aux métadonnées d’image |
| Anti-patterns | Utiliser le signeur comme hôte de compilation générique | Commiter des .p12 dans les dépôts d’artefacts | Tâches « toujours récupérer le dernier profil » |
La gouvernance est saine lorsqu’une révocation se projette en minutes sur les nœuds et pipelines concernés, et non lorsque « ça compile en général ».
Si les archives et les builds PR partagent le maillage, facturer et louer la signature séparément des files de compilation ; avec les verrous de siège du pool, évitez de retenir des verrous de compilation en attendant des validations Trousseau.
Exécutez ces étapes en parallèle des six étapes Golden Image : les images portent les chaînes d’outils, cet article porte les artefacts de signature et les frontières Trousseau. Chaque étape nécessite un identifiant de ticket ; avec les baux de pool, l’acquisition d’un siège signeur ne doit pas retomber sur la file de compilation.
Geler le manifeste de profil : stocker profiles.json (UUID, nom de fichier, expiration, identifiant d’équipe) dans Git ou un compartiment protégé ; les contrôles CI doivent correspondre aux montages des nœuds.
Déclarer la topologie dans le README : dédié contre distribué contre par exécuteur plus les noms d’hôte autorisés à détenir des clés privées.
Trousseau et politique de déverrouillage : découper une partition Trousseau CI et documenter les fenêtres security unlock-keychain plus le repli en cas d’échec.
Contrôler chaque export .p12 : double validation et numéros de ticket, pas d’« export temporaire sur le Bureau ».
Étendre les sondes : au-delà des empreintes d’outils, hacher security find-identity -v -p codesigning dans les index de journaux.
Faire tourner en staging : répéter la fenêtre de sept jours avant expiration avec UUID parallèles et retour arrière ordonné.
export PROFILE_MANIFEST_SHA="$(shasum profiles.json | awk '{print $1}')"
export SIGNING_SUMMARY="$(security find-identity -v -p codesigning | shasum | awk '{print $1}')"
node scripts/assert-signing-context.mjs \
--expect-manifest "${PROFILE_MANIFEST_SHA}" \
--expect-signing "${SIGNING_SUMMARY}" \
--region "${RUNNER_REGION}"
Note : la sortie des sondes appartient uniquement aux index de journaux – ne pas publier d’empreintes de clés privées dans les métadonnées d’artefacts publics ; les SBOM externes peuvent utiliser les six derniers chiffres de série ou des alias internes.
Le faux positif classique : profil de l’app hôte mis à jour alors que les extensions pointent encore vers l’ancien UUID. Ordre de triage : comparer embedded.mobileprovision aux arguments de build, puis comparer les résumés d’identité Trousseau, puis les réglages du projet Xcode. En enchaînant avec l’article chaîne de tâches observable, inclure profile_manifest_sha dans les enveloppes de transfert.
Triade de preuve : équipe, autorité et ressources scellées depuis codesign -dvvv.
Diff de manifeste : le nœud en échec et le nœud en succès partagent-ils le même hachage profiles.json ?
Fenêtre de déverrouillage : la première signature sans surveillance est-elle tombée hors de l’intervalle autorisé ?
Mappage par cible : le CODE_SIGN_STYLE de chaque cible s’associe à son spécificateur.
Pipelines d’export : archive contre ad hoc ne doit pas réutiliser le mauvais répertoire de profils.
Émettre l’idempotence : la fin de file porte la version du manifeste pour éviter une double signature en aval.
Avertissement : ne pas mélanger la signature automatique avec des chemins de fichiers de profil explicites pendant les fenêtres parallèles – cela produit des échecs sporadiques par cible sur le maillage.
Trois bandes de planification issues de la pratique iOS multi-régions – remplacez-les par votre propre télémétrie et conservez la provenance pour les audits.
| Taille d’équipe | Conformité | Cadence de release | Premier choix stable |
|---|---|---|---|
| Petite | Standard | Hebdomadaire ou plus | Signeur dédié plus manifeste explicite ; interdire le .p12 partagé |
| Moyenne | Standard | Quotidienne ou plus | Distribution contrôlée plus montages en lecture seule plus rotation automatisée |
| Plateforme | Élevée | Continue | Sidecar de classe HSM plus index d’audit complet |
| Multi-fournisseur | Moyenne | Irrégulière | Pools d’exécuteurs isolés plus préfixes de profil par projet |
Les portables qui servent de signeurs héritent du veille, des mises à jour système et des invites Trousseau non auditées ; les flottes Mac sur site ralentissent l’achat et la synchronisation multi-sites. Les nœuds Mac distants sous contrat conviennent mieux au rôle de maillage « portail de signature ».
Anti-pattern : prendre un codesign réussi par intermittence comme preuve que les profils sont sains – imposer les hachages de manifeste dans les sondes.
Le maillage plus une signature auditable survit rarement à la seule politique informelle, et les portables empruntés ne peuvent pas prouver que les clés privées sont restées dans des zones contrôlées. Pour une signature reproductible et des contrôles stables, la location cloud Mac Mini VpsMesh est en général le meilleur alignement : choisir région et SKU, dédier des nœuds et séparer les contrats signeur des exécuteurs de compilation afin que la politique du maillage devienne des conditions contractuelles applicables plutôt qu’une habitude personnelle.
Épingler la version du profil et la date d’expiration au contrôle pipeline ; utiliser des noms de fichiers explicites pendant les fenêtres UUID parallèles ; aligner les champs d’idempotence avec l’article sur les exécuteurs du pool de build partagé. Pour des nœuds signeur isolés, voir Mac Mini M4 commander.
Commencer par Golden Image et dérive pour figer les lots d’outils, puis revenir ici pour les certificats et les cartes de profils. Comparer les tarifs de location avec l’article TCO sur trois ans.
La connectivité est dans le centre d’aide ; les bases de relais dans la checklist SSH contre VNC ; en cas de profils capricieux, revérifier la section trois et les hachages de manifeste.