三類到期對象 · SSH/VNC 決策表 · ASC→鑰匙串→Xcode · 20 分鐘驗收
沒有自有 Mac、卻在租用雲端節點上維護 iOS 簽名鏈的獨立開發者與外包團隊,常在郵件提醒「證書即將過期」時陷入兩難:該先登入 Apple Developer 點續期,還是先在 Xcode 裡下載描述檔?更糟的是,ASC 顯示已更新,本地卻仍報 Signing certificate not found 或 Provisioning profile expired——於是在 SSH 裡反覆刪 DerivedData,把按小時計費的租期燒成零產出。本文以「到期續期、吊銷後重簽、續期後仍 Signing 失敗」為單一主線:先釐清三類到期對象,再給僅 SSH / SSH+VNC 分段 / 全程 VNC決策表、ASC → 續期 → 鑰匙串 → Xcode推薦順序與八步 Runbook、續期後仍失敗的分界,以及20 分鐘可勾選驗收表;並與站內《遠程 Mac 首次使用清單》、《系統時間與證書》、《Fastlane Match》、《TestFlight 外測》、《緊急上架》互鏈。
租用遠程 Mac 時,最容易浪費時間的是把三種不同生命週期混為一談。它們的修復入口、是否需要 VNC、以及對已上架構建的影響都不相同:
Apple Developer 證書(Certificate):分發證書(Apple Distribution / iOS Distribution)與開發證書(Apple Development)在開發者後台有明確到期日。過期後,依賴該證書簽名的所有描述檔都會連帶失效;僅替換 .mobileprovision 無法根治。
描述檔(Provisioning Profile):綁定 App ID、Team、設備列表(開發用)與 Capability。證書仍有效時,描述檔可單獨過期;Xcode 常提示 profile doesn't include signing certificate 或設備未包含。此時應在 ASC/Developer 刷新描述檔並讓 Xcode 重新下載,而非盲目 Revoke 證書。
本機鑰匙串會話(Keychain session):證書與私鑰已匯入,但未解鎖登入鑰匙串、未對 Xcode 點「始終允許」,或 SSH 用戶與 VNC 桌面用戶不一致,會表現為「後台明明有效、本地卻找不到身分」。這類問題不是 ASC 續期能解決,必須在圖形會話修復授權。
吊銷(Revoke)與續期(Renew)的差異:續期通常生成新證書 + 新私鑰,舊證書在寬限期後不可用;吊銷則立即讓舊簽名鏈失效。團隊若用 Match,應在變更前確認 Git 倉庫與 CI 只讀節點,避免一半機器仍拉舊檔。
租用邊界:雲端節點上的鑰匙串是會話資產;租期結束若未導出 .p12 或未把 Match 倉庫當唯一真相源,換機後會重演「郵件又說快到期」的恐慌。續費與換節點請對照《續費與換節點備份》。
常見誤判:看到 Xcode 紅字就 Revoke 所有證書。若只是描述檔過期或本機鑰匙串未授權,Revoke 會迫使全隊重新簽名,在租用計費環境裡成本極高。
實務上建議在工單標題寫清層級,例如「L1-cert-expiry」「L2-profile-only」「L3-keychain-ui」,避免值班同時改三層導致無法回滾。
下列矩陣按任務 → 推薦接入 → 典型失敗信號 → 常見誤判排列,可直接貼進 Runbook。原則與《Organizer 與 Transporter》一致:涉及 Apple ID、鑰匙串對話框、Xcode Accounts 圖形刷新的步驟,應標記為 needs-vnc。
| 任務 | 推薦接入 | 典型失敗信號 | 常見誤判 |
|---|---|---|---|
| 在 Developer 後台續期/建立證書 | 瀏覽器(本機或 VNC Safari) | 2FA 收不到碼 | 以為 SSH 能代替網頁 |
| 下載並安裝 .cer / .p12 | VNC(雙擊 + 鑰匙串) | import 成功但 codesign 找不到 | 裝進 System 而非 login |
| Xcode → Settings → Accounts 刷新 | VNC | SSH 裡 session 無 Team | 只重裝 CLT |
| Signing & Capabilities 自動簽名切換 | VNC | 自動簽名灰掉 | 手改 project.pbxproj |
| security find-identity 探針 | SSH 或 VNC 終端 | 列表為空 | 誤判為證書未續 |
| 手動安裝 .mobileprovision | SSH(拷貝到目錄)+ VNC 驗證 | UUID 仍指向舊檔 | 未刪 ~/Library/MobileDevice 舊檔 |
| fastlane match / sigh | SSH(倉庫已配置) | 掛起無輸出 | 其實是鑰匙串彈窗 |
| Revoke 後全隊重簽 | SSH 編排 + VNC 抽樣驗收 | CI 與本地不一致 | 只改一台雲端機 |
經驗法則:ASC/Developer 已顯示新證書,但 find-identity 仍只有舊 CN——先查用戶是否一致、鑰匙串是否解鎖,再查是否下載到新描述檔;不要在第三層就 Revoke。
在租用節點上,建議固定以下順序,把「需要點按」的步驟集中在一次 VNC 會話完成,減少來回切換:
凍結變更窗口:通知團隊暫停 Release 構建;若用 Match,確認無人同時 match nuke。先對照時間與 NTP,排除「尚未生效」假陽性。
Developer / ASC 側續期:Certificates, Identifiers & Profiles 中對過期項執行 Renew 或建立新證書;記錄新證書 Serial / 到期日。若曾洩漏私鑰,選 Revoke 並走重建流程,而非續期。
刷新描述檔:對受影響 App ID 重新 Generate Profile;確認 Capability(Push、App Groups 等)與工程一致。下載 .mobileprovision 備份到密鑰管理系統。
VNC 匯入私鑰:雙擊 .p12,選擇登入鑰匙串,密碼正確;在「允許 Xcode 存取」對話框選始終允許。詳見《遠程 Mac 證書配置》與《Xcode 簽名圖形指南》。
Xcode Accounts:Settings → Accounts → 選 Team → Download Manual Profiles 或依團隊規範啟用 Automatic Signing。確認無黃色警告。
工程側對齊:Target → Signing 選正確 Team;若用手動描述檔,比對 UUID 與剛下載檔案一致。清理過期 ~/Library/MobileDevice/Provisioning Profiles 中同名舊檔(可先備份)。
煙測構建:先 Debug 真機或模擬器,再 Release Archive;Match 團隊在此步執行 match appstore 或 readonly 同步。
證據留存:截圖 Accounts 頁、find-identity 前幾行、Archive 成功時間戳;若要上傳,接上傳決策表。
# 與 VNC 同一 macOS 用戶執行(SSH 或桌面終端均可) whoami date /usr/bin/security find-identity -v -p codesigning | head -n 20 ls -lt ~/Library/MobileDevice/Provisioning\ Profiles | head -n 5
若團隊使用自動簽名,步驟 05–06 可由 Xcode 代勞,但首次在雲端機上仍建議 VNC 親眼確認 Team 與 Bundle ID 無誤。若使用Fastlane Match,應以倉庫為權威:後台續期後執行 match 同步,而非手工改每台機——細節見Match 專文。
下列表格用於值班分流:現象 → 優先懷疑層級 → 建議動作。目標是在租用環境裡最少次數恢復可 Archive 狀態。
| 現象 | 優先層級 | 建議動作 |
|---|---|---|
| Certificate not valid yet | L0 時間 | 核對 NTP/時區後重試 |
| No signing certificate found | L3 鑰匙串 | 同用戶 VNC 匯入 p12 + 始終允許 |
| Profile doesn't match | L2 描述檔 | 刪舊 UUID、重新下載 |
| find-identity 有證書但 Archive 失敗 | L2/L3 | 比對 profile 內嵌證書 CN 與 identity |
| 僅 CI 失敗、本地成功 | 用戶/鑰匙串 | 統一 Runner 用戶與 Match readonly |
| 續期後全員失敗 | L1 證書 | 確認是否 Revoke 未同步 Match |
| Capability 相關錯誤 | ASC 設定 | 改 App ID 後必須重生描述檔 |
維護窗口建議預留 ≥20 分鐘,在同一 VNC 用戶下逐項勾選;通過後再釋放團隊構建。
| 核對項 | 操作要點 | 通過標準 |
|---|---|---|
| 用戶一致 | VNC 用戶 = SSH whoami | 無跨用戶鑰匙串 |
| Developer 證書 | 後台到期日晚於維護日+30天 | Serial 與工單記錄一致 |
| 描述檔 | UUID 與工程一致 | Xcode 無 profile 黃標 |
| find-identity | 含正確 Distribution CN | 至少一條 valid |
| Debug 煙測 | 真機或模擬器 Run | 安裝成功 |
| Archive | Release + Organizer | Archive 成功有時間戳 |
團隊證書倉庫與 SSH/VNC 分工。
閱讀 →排除「尚未生效」假警報。
閱讀 →續期後上傳構建決策。
閱讀 →若底層證書仍有效且 Capability 未變,刷新描述檔常可恢復。若證書已過期或被吊銷,必須先在 Developer 續期/重建,再讓 Xcode 下載並落地鑰匙串。
find-identity、匯入腳本、xcodebuild 可在 SSH 執行;2FA、鑰匙串「始終允許」、Accounts 刷新仍需與構建同一用戶的 VNC。
按第四節分界:時間 → 鑰匙串用戶 → 描述檔 UUID → 證書/Match 同步。勿在未備份前 Revoke 整條倉庫。
已處理完成的構建通常仍可測;新 Archive 必須用新證書重簽。請更新外測檢查表中的構建號與 CI 密鑰。
證書與描述檔續期不是「點一下 Renew 就結束」,而是後台物件、本機鑰匙串、工程設定三層對齊的過程。在按小時計費的雲端 Mac 上,把 VNC 當作簽名鏈的標準介面而非救火通道,才能把續期壓進可預測的 20 分鐘窗口,並在換機、續費時保留可交接的證據。
若你需要按任務租用帶完整桌面會話的物理 Mac,在本文第五節同款表格下完成續期驗收,可透過 VNCMac 開通遠程節點:主按鈕進入購買頁;連接方式可先查閱站點幫助頁中的 SSH 與 VNC 說明。