Apple 說明,App Store Connect API 請求使用的 JWT 有效時間最長為 20 分鐘;這是權杖時效,不能據此判定 API Key 已撤銷。Apple 的 JWT 產生說明
症狀 → fastlane 授權失敗
最快解法 → 先查明錯誤類型;若 API Key 確已撤銷,就建立新密鑰並替換所有舊憑證使用點,無法重新啟用舊密鑰。
正在使用 fastlane 自動上傳 App 或管理 TestFlight 的獨立開發者,適合依本文恢復發布流程。
若您只需要初次建立密鑰,或正比較個人密鑰與團隊密鑰的選擇,本文聚焦的是故障復原與驗收。
先分辨授權錯誤:JWT 失效不等於密鑰撤銷
fastlane 出現 API Key 無效或授權失敗時,不要直接撤銷、重建密鑰。先保存錯誤訊息、執行時間與目前設定所用的 Key ID,再核對請求是否拿到正確的 Issuer ID、私鑰及角色權限。Apple 對 API Key、JWT 與 API 存取的說明可參考App Store Connect API 使用說明。
| 故障分支 | 常見線索 | 優先核對項目 |
|---|---|---|
| JWT 過期或產生失敗 | 錯誤發生在請求授權階段,或系統時間、權杖生成流程有疑點 | 重新產生請求權杖;按 Apple 說明核對簽署與有效時間 |
| API Key 已撤銷 | 該 Key ID 在 App Store Connect 中已撤銷 | 確認密鑰狀態,列出所有仍引用它的工作流程 |
| 私鑰與 Key ID 不相符 | 更換過其中一項設定,但另一項仍指向舊密鑰 | 確認 p8 檔案與 Key ID 來自同一次建立 |
| API 權限不足 | 認證似乎可通過,但指定操作遭拒 | 核對密鑰角色是否允許該操作 |
fastlane 提示 API Key 無效,應先檢查什麼?
先確認執行中的 lane 實際讀取哪一份設定,而非只檢查開發者以為已更新的環境變數。比對 Key ID、適用時的 Issuer ID、p8 私鑰來源與錯誤時間;再查看錯誤屬於權杖簽署、API 授權,還是特定操作權限不足。fastlane 的App Store Connect API 設定文件說明其 API Key 整合方式。
密鑰狀態已確認:撤銷後只能替換,不能復原
Apple 的密鑰管理規則不提供將已撤銷 API Key 重新啟用的方式。舊 p8 私鑰也不能靠再次下載取回;若狀態已確認為撤銷,復原路徑就是建立新密鑰,然後更新所有依賴舊憑證的設定。Apple 的 API Key 建立與管理說明可用來核對密鑰規則與建立權限。
先盤點 fastlane lane、CI 工作流程、排程任務及遠端 Mac 上的環境變數或密鑰儲存位置。若是疑似外洩,應先撤銷舊密鑰以限制風險,再建立替代密鑰;這可能造成短暫發布中斷,因此要同步安排更新與驗證。若是計畫內輪換,則應先確認密鑰類型,再決定能否在切換期間保留新舊密鑰並行。
注意:若錯誤只在執行一段時間後出現,而 Key ID 狀態未變,應先檢查 JWT 生成與使用流程。Apple 記載 JWT 有效時間上限為 20 分鐘,不代表 API Key 本身每隔相同時間就會失效。Apple JWT 文件
密鑰類型會改變遷移順序
個人密鑰與團隊密鑰的管理方式不同,不能把其中一種的輪換步驟直接套用到另一種。Apple 文件指出,每位使用者只能有一個有效的個人 API Key,而團隊 API Key 可建立多個;應以帳號畫面與Apple 的密鑰建立規則核實目前權限及可用操作。
個人密鑰只有一個有效名額時,計畫內替換通常無法照團隊密鑰方式先建立新舊兩把密鑰並行測試;需要先規劃停用與切換窗口,並確認有權管理該密鑰的帳號能完成替換。團隊密鑰可建立多個時,若目前角色允許,可先建立替代密鑰、更新受控環境並驗證,再撤銷舊密鑰。疑似外洩時,安全處置優先於維持並行。
| 密鑰類型 | 計畫內遷移的安排 | 操作前核對 |
|---|---|---|
| 個人密鑰 | 不假設可新舊並行;安排替換時段並預留更新與驗證時間 | 使用者是否已有有效密鑰、帳號能否建立或管理替代密鑰 |
| 團隊密鑰 | 若權限與政策允許,可先建立替代項目並逐一切換使用點 | 建立者角色、所需操作權限、舊密鑰撤銷時機 |
按里程碑替換遠端 Mac 上的 fastlane 憑證
fastlane 的 app_store_connect_api_key action 支援以檔案路徑或私鑰內容等方式提供 API Key 設定;實際採用哪一種,應以專案目前的設定及fastlane action 參數文件為準。不要為了快速修復,把私鑰直接寫進程式碼、版本控制資料庫或會輸出機密的除錯日誌。
更換密鑰後,哪些自動化設定要更新?
所有實際引用舊 Key ID 或舊 p8 私鑰的設定都要盤點,包括 lane 設定、環境變數、密鑰管理工具、CI 工作流程與遠端 Mac 任務。只更新一份設定檔,但漏掉排程任務或另一個工作目錄,常會讓新密鑰看似已部署、實際執行仍讀到舊值。
建議依下列里程碑操作:
里程碑一:定位使用點。 在每個發布工作流程中找出目前讀取的 Key ID、Issuer ID(若該設定需要)及私鑰來源。確認排程工作與手動執行使用的是同一套設定。
里程碑二:建立替代密鑰。 由具備相應權限的帳號建立新密鑰,安全保存下載取得的 p8 私鑰。確認沒有把私鑰內容貼入團隊訊息、程式碼提交或命令輸出。
里程碑三:更新憑證來源。 在遠端 Mac 的密鑰儲存位置或受控環境變數中替換私鑰與識別資訊。fastlane action 若以 key_filepath 讀取檔案,就核對檔案路徑及執行帳號的讀取權限;若使用 key_content,就確認注入內容來自受保護的憑證來源,而非倉庫中的固定字串。參數用法以fastlane action 文件為準。
里程碑四:驗證執行環境。 在遠端 Mac 上確認工作目錄、lane、環境變數範圍及密鑰讀取方式與預期一致。檢查時只核對路徑、Key ID 或是否載入,不輸出私鑰本身;若同一任務有互動式與排程式執行,也要分別確認它們讀取的設定。
里程碑五:分層測試發布鏈路。 先以符合密鑰角色權限的低風險 API 操作確認授權,再執行專案實際需要的上傳任務。確認上傳是否完成後,另行查看 App Store Connect 中的處理狀態;API 認證成功、檔案交付完成與後續處理完成,是不同的驗收結果。
里程碑六:撤銷舊密鑰並記錄復原。 團隊密鑰在並行測試後,確認沒有工作流程再引用舊憑證才撤銷;若屬疑似外洩,則依安全處置要求先撤銷。記錄替換範圍、憑證交付方式及驗證結果,但不要記錄私鑰或可識別帳戶的資訊。
遠端 Mac 上如何替換 fastlane 使用的 p8 私鑰?
先找出 lane 使用的 key_filepath 或 key_content 來源,再將新 p8 私鑰安全放到該來源並更新對應設定;接著以相同執行帳號和工作目錄做低風險授權測試。若查不到執行時實際讀取的位置,先不要刪除舊設定或在日誌中列印私鑰,應先確認排程任務的環境與密鑰掛載方式。
- [ ] 已確認舊 Key ID 的狀態,並分清 JWT 錯誤、密鑰撤銷、私鑰錯配與權限不足
- [ ] 已盤點所有 fastlane lane、CI 工作流程、排程任務及遠端 Mac 使用點
- [ ] 新 Key ID、適用時的 Issuer ID 與 p8 私鑰來自同一組新密鑰
- [ ] 遠端 Mac 實際執行帳號能讀取憑證,且私鑰未進入程式碼或日誌
- [ ] 已分別驗證 API 權限、上傳交付與 App Store Connect 後續處理狀態
- [ ] 舊密鑰只在完成遷移後撤銷;疑似外洩情況則優先撤銷並接受短暫中斷
若需要檢查遠端環境的憑證保存與存取方式,可參考ArmVNC 隱私與資料處理說明及ArmVNC 幫助中心,並依實際使用的服務設定核對。
恢復驗收:授權成功不代表發布已完成
替換完成後,應將「API 認證通過」、「上傳任務完成」與「App Store Connect 處理完成」分開記錄。若第一項通過、上傳仍失敗,問題可能在交付步驟或工作流程;若上傳成功但處理尚未完成,也不能宣稱整條發布鏈路已恢復。這種分段驗收能避免再次把權限、憑證或後續處理問題混成同一個「API Key 無效」。
如果目前依賴個人電腦執行發布,常見限制是電腦關機或離線時排程無法運作、開發工作與打包工作爭用資源,以及憑證散落在多個本機工作環境而難以盤點。自購 Mac 可提供固定硬體,但需要自行承擔採購與維護;若只是需要一段時間的穩定 macOS 發布環境,遠端 Mac 租用可作為另一種選擇。您可先查看ArmVNC 香港 Mac 方案,再按發布頻率、憑證管理方式與預算判斷是否適合;若工作長期高負載或必須連接本地實體設備,則應先評估自有硬體是否更合適。
憑證更新後,接續完成 iOS 發佈
使用 ArmVNC 獨享 Apple Silicon 雲端 Mac,重新整理簽署環境並驗證建置流程。
