三类到期对象 · 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 说明。