公証は Apple がバイナリをスキャンした証明です。ステープル(stapling)はチケットを埋め込み、Gatekeeper がオフラインで検証できるようにします。方針なしに「常にステープル」すると毎ビルドで数分を浪費します。「決してステープルしない」とエアギャップのラボで痛い目を見ます。Mac mini M4 CI Runner、特に NodeMac の香港・日本・韓国・シンガポール・米国の専用ホストでは、ステープル方針を配布チャネル、ネットワーク前提、成果物タイプに結び付けたマトリックスを公開しましょう。本稿では 2 つのマトリックス、8 ステップ、セキュリティレビュアーがパイプラインを読む流れに沿った FAQ 構造化データを示します。
ストレージと保持の文脈:ディスクと成果物保持、ロックファイルハッシュキャッシュ。2 つの署名済みツリーを GUI で比較する場合は同一 NodeMac ホストで VNC。料金;ヘルプ。
Gatekeeper:オンラインのチケット照会 vs ステープル済みチケット
macOS は公証に成功しても、チケットが未ステープルで初回起動時に Apple サービスに届かないとユーザー体験を損ねます。逆にステープルは外側のコンテナ(例:.dmg)を変えるため、早すぎるハッシュ計算は単純なチェックサムゲートを破ります。CI 方針では監査成果物としてのチェックサム(ステープル前)と顧客へ出荷する blob(ステープル後)を明記してください。
- チケットのみ:ラボ Mac の外向きが安定し再チェック方針を握っているとき最速で反復できます。
- ステープル済み:顧客向けディスクイメージ、オフラインインストーラ、フィールドノート PC の既定です。
- ハイブリッド:リリースチャネルのみステープル;ナイトリーは明示バナー付きでチケットのみにします。
マトリックス A:配布経路別にステープルかチケットか
| 成果物と経路 | ステープル? | 根拠 |
|---|---|---|
| 開発者向け USB キオスクの .dmg | はい | オフライン Gatekeeper;初回起動の CDN 依存を避ける |
| 有線ラボでの CI スモークインストール | 任意 | 外向き監視下で失敗許容ならチケットのみがループを高速化 |
| MDM 配布 pkg とインストール後ステープル | どちらでも | パイプラインか MDM のどちらがステープルするか文書化し二重作業を避ける |
| App Store アップロードパイプライン | Apple 転送ドキュメントに従う | 消費者経路が異なる;デスクトップ DMG のルールを安易に持ち込まない |
マトリックス B:CI ステージ順序と検証
| ステージ | コマンド系 | 合格基準 |
|---|---|---|
| 署名 | codesign エンタitlements マトリックスに沿ったハードンドランタイム |
codesign --verify --deep --strict がクリーン |
| 公証 | notarytool submit + ポーリング |
ログが Accepted;提出 ID を保管 |
| ステープル | xcrun stapler staple |
クリーン VM で stapler validate が OK |
| スモーク | マウント済みイメージからアプリ起動 | 「破損」ダイアログなし;テレメトリが期待バージョンと一致 |
数値ガードレール
- タイムアウト予算:リリーストレインでは notary ポーリングに少なくとも 25 分の壁時計を;フィーチャーブランチはフレーク許容なら短くてよい。
- 並行提出:ホストあたり同時公証ジョブを 2 に上限し、Xcode ピークと Apple 側スロットリングの衝突を避ける。
- 成果物不変性:ステープル後オブジェクトは新しいオブジェクトキーへアップロードし、上書きしない。
監査のコツ:変更チケットに公証提出 ID とステープル前成果物の SHA-256 の両方を添付する。ステープルは署名ログの代替にならない。
8 つのロールアウトステップ
- チャネル棚卸し:各ビルドタイプの出荷先(ラボ、顧客、MDM)。
- マトリックスをコード化:Slack の暗黙知ではなくパイプラインテンプレートへ。
- ジョブ分割:ビルド/署名、公証、ステープル、公開を別ステップと別キャッシュに。
- VM スモーク追加:外向き Apple エンドポイントを任意で無効化し未ステープルを検知。
- ログ保管:notarytool を他の署名証跡と同じ保持バケットへ。
- 署名証明書ローテ:カレンダー運用;毎回ローテ後にマトリックス検証を再実行。
- オンコール教育:stapler エラーと notarytool エラーはオーナーが異なる。
- リージョン専用 M4:キュー時間が危険なショートカットを迫るとき——NodeMac はハードウェア競合を政策議論から外す。
FAQ
CI はいつステープル必須?
ユーザーがオフラインまたは未管理ネットからインストールするとき。十分に接続された内部ループで文書化されていればチケットのみでもよい。
ステープルはチェックサムキャッシュを壊す?
はい——監査はステープル前でハッシュ;ステープル後 blob は別チェックサムで出荷成果物として扱う。
stapler が早すぎると?
Gatekeeper は破損アプリとして拒否。署名 → 公証 → 検証 → ステープル → 再検証の順を強制する。