配布ノード・専用サイナー・プロファイルローテーション・キーチェーン境界・意思決定マトリクス
モバイルおよびプラットフォーム責任者が複数ノードのリモートMacメッシュを運用していると、「ここではArchiveの署名は通るのに、向こうのCIではプロビジョニングが落ちる」といった事象に直面しがちです。ローテーション期間のずれ、配布用証明書が共有ディスクに置かれる、あるいは各ランナーが独自の.p12とチーム文脈を取り込む、といったパターンです。本稿では専用サイナー、ランナーごとの身元、制御された配布を比較し、ローテーションとべき等性のルールに沿ったプロファイルとバンドルの対応を整理し、六段階のランブックを示したうえで、規模・コンプライアンス・リリース頻度のマトリクスで締めくくります。ゴールデンイメージのドリフトチェックリスト、共有ビルドプールのランナー、OIDCによる短命クレデンシャルの保管へのクロスリンクにより、署名コンテキストをツールチェーンのバッチと揃えます。
ゴールデンイメージのチェックリストに従っているのに、メッシュ全体でerrSecInternalComponentやプロビジョニングの不一致が出ることがあります。根本原因は多くの場合、署名コンテキストがパイプラインの一次メタデータになっていないことです。プロファイルのUUID、チームID、証明書フィンガープリント、キーチェーンの範囲は、IMAGE_IDと同様に監査可能である必要があります。共有ビルドプールでは、ランナーが任意の.p12束を取り込むと、コンプライアンスとトリアージの両方が同時に崩れます。
ローテーション期間:Apple Developer側でプロファイルが更新されたあと、古いUUIDが一部ノードに残り、失敗がランダムに見えます。「最新を取得」ではなく、明示的なマニフェストの版を固定します。
配布証明書の散乱:一つの.p12を多くのメッシュホストにコピーすると、一度の失効で全体が止まり、監査では秘密鍵をどこに誰が取り込んだか答えられません。
キーチェーン範囲のずれ:ログインとシステムのキーチェーンの組み合わせと、CIユーザー向けのアンロック方針のばらつきにより、ヘッドレス署名が断続的に身元を見失います。
複数App IDの対応ミス:拡張機能はホストアプリとは別のプロビジョニングが必要ですが、PROVISIONING_PROFILE_SPECIFIERがxcodebuild引数で一度だけハードコードされている、という形です。
プロファイルとビルドキャッシュの混在:プロファイルをDerivedDataの隣の「消してよい」ツリーに置くと、クリーナが一晩で削除します。
この五つをオンコールの順序づけに「コンパイラより前の署名レイヤー」として載せると、無駄な再試行を減らせます。ハンドオフの人間待ち時間が待ち行列を膨らませるため、SSHとVNCのチェックリストと組み合わせ、サイナーホストでキーチェーンのプロンプトを誰が押してよいか決めてください。
どのトポロジーも万能ではありません。失効の爆発半径、コンプライアンス上の証跡、メッシュの伸縮性に合わせます。専用サイナーは失効面を最小化しますが待ち行列が生じます。ランナーごとの鍵は並列度は伸びますが監査コストが爆発します。制御された配布はその中間で、マニフェストと読み取り専用マウントが必要です。OIDCによる秘密の保管と同じ教訓で、秘密鍵素材は寿命を最短に、露出を最小にします。
| 観点 | 専用サイナー | ランナーごとの身元 | 制御された配布 |
|---|---|---|---|
| 失効の波及範囲 | 最小。ローテーションは境界内に収まる | 最大。ホスト単位の追跡が必要 | 中程度。マニフェストの版で管理 |
| 待ち行列とメッシュの伸縮 | ボトルネック化のリスク。予約やサイドカー書き出し | 高い並行性 | 中から高。プロファイル取得を並列化 |
| コンプライアンス監査 | 最も容易。アクセスと書き出しを記録 | 最も難しい。鍵が分散 | 中程度。マウントが不変であることを証明 |
| ゴールデンイメージとの結合 | サイナーは独自のバッチを追跡できる | 証明書がイメージIDからずれる | プロファイル更新はイメージメタデータの隣に置く |
| アンチパターン | サイナーを汎用コンパイルホストにする | 成果物ストアに.p12をコミットする | 「常に最新プロファイルを取得」ジョブ |
ガバナンスが健全なのは、一度の失効から数分で影響ノードとパイプラインに写像できるときであり、「だいたいビルドは通る」ときではありません。
ArchiveとPRビルドが同じメッシュを共有する場合は、コンパイルの待ち行列とは別に署名の課金とリースを切り分けます。プール座席のロックでは、キーチェーンの承認待ちのあいだコンパイル用ロックを握り続けないでください。
ゴールデンイメージの六段階と並行して実行します。イメージはツールチェーンを担当し、本稿は署名成果物とキーチェーン境界を担当します。各段階にチケットIDが必要です。プールのリースでは、サイナー座席の取得をコンパイルの待ち行列から切り離します。
プロファイルマニフェストを固定する:profiles.json(UUID、ファイル名、有効期限、チームID)をGitまたは保護されたバケットに置き、CIのゲートはノードのマウントと一致させます。
READMEにトポロジーを宣言する:専用か分散かランナーごとか、秘密鍵を置いてよいホスト名を書きます。
キーチェーンとアンロック方針:CI用のキーチェーン区画を切り、security unlock-keychainの許可ウィンドウと失敗時のフォールバックを文書化します。
すべての.p12書き出しをゲートする:二重統制とチケット番号。「とりあえずデスクトップへ一時書き出し」は禁止です。
プローブを拡張する:ツールチェーンのフィンガープリントに加え、security find-identity -v -p codesigningをハッシュしてログ索引に載せます。
ステージングでローテーションする:本番プロファイルの有効期限の七日前から並行UUIDと順序付きロールバックでリハーサルします。
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}"
注:プローブの出力はログ索引にのみ載せ、秘密鍵のフィンガープリントを公開の成果物メタデータに載せないでください。外部SBOMでは下六桁のシリアルや内部エイリアスに留めます。
典型的な偽陽性は、ホストアプリのプロファイルは更新されたが拡張がまだ古いUUIDを参照しているというものです。トリアージ順は、embedded.mobileprovisionをビルド引数と比較し、次にキーチェーンの身元サマリを比較し、最後にXcodeのプロジェクト設定を比較します。観測可能なタスクチェーンの記事と連鎖させる場合は、ハンドオフの封筒にprofile_manifest_shaを含めます。
証跡の三つ組:codesign -dvvvのチーム、Authority、Sealed Resourcesです。
マニフェストの差分:失敗ノードと成功ノードは同じprofiles.jsonのハッシュを共有していますか。
アンロックウィンドウ:最初の無人署名が許可されたアンロック間隔の外に出ていませんか。
ターゲットごとの対応:各ターゲットのCODE_SIGN_STYLEは対応するspecifierと組になります。
書き出しパイプライン:Archiveとアドホックで誤ったプロファイルディレクトリを再利用してはいけません。
べき等性の送出:キュー完了時にマニフェストの版を運び、下流の二重署名を防ぎます。
警告:並行期間中に自動署名と明示的なプロファイルファイルパスを混在させないでください。メッシュ上でターゲットごとに断続的な失敗として表れます。
複地域のiOS実務からの三つの計画帯です。自社のテレメトリに差し替え、監査用に出典を残してください。
| チーム規模 | コンプライアンス | リリース頻度 | 最初の安定選択 |
|---|---|---|---|
| 小 | 標準 | 週一回以上 | 専用サイナーと明示マニフェスト。共有.p12は禁止 |
| 中 | 標準 | 日次以上 | 制御された配布と読み取り専用マウントと自動ローテーション |
| プラットフォーム | 高 | 継続的 | HSM級サイドカーと完全な監査索引 |
| 複数ベンダー | 中 | 不定期 | 隔離ランナープールとプロジェクトごとのプレフィックス |
ノートPCをサイナー代わりにすると、スリープ、OS更新、監査されないキーチェーンプロンプトを引きずります。オンプレのMac群は調達と複数サイト同期が重くなります。契約に裏打ちされたリモートMacノードの方が、メッシュの「署名ゲート」の役に適合しやすいです。
アンチパターン:codesignがときどき成功したことをプロファイルが正しい証拠にしないでください。プローブにマニフェストのハッシュを強制します。
メッシュと監査可能な署名が、非公式の方針だけで長く保たれることは稀で、借りたノートPCでは秘密鍵が管理区域に留まったことを証明できません。再現可能な署名と安定したゲートのためには、VpsMeshのMac Miniクラウドレンタルの方が多くの場合適しています。リージョンとSKUを選び、ノードを専有し、サイナー契約とコンパイル用ランナーを分離すると、メッシュ方針が個人の習慣ではなく契約上執行可能な条件になります。
パイプラインのゲートでプロファイルの版と有効期限を固定し、並行UUIDの期間中は明示的なファイル名を使い、べき等性フィールドを共有ビルドプールのランナーの記事と揃えます。隔離したサイナーノードについてはご注文ページを参照してください。
まずゴールデンイメージとドリフトでツールチェーンのバッチを固定し、証明書とプロファイル対応表のためにここへ戻ります。料金は三年TCOの記事と比較してください。
接続の話題はヘルプセンターにあります。リレーの基準値はSSHとVNCのチェックリストにあります。プロファイルが不安定な場合はセクション3のプローブとマニフェストのハッシュを再確認してください。