本文要点
- CI 上为签名单独准备钥匙串 + 最小权限证书,避免与登录用户钥匙串混用导致
errSecInternalComponent。 codesign与 Hardened Runtime、entitlements 要按产物类型(app、helper、XPC、插件)分层校验,再送公证。- 用
xcrun notarytool提交与轮询;通过后对分发包执行stapler staple,区分公证失败与装订失败。 - 排障先对齐 submission id 与证书指纹;Runner 取舍见 Bitrise 与自建云 Mac Runner 决策文。

codesign / notarytool 日志与钥匙串访问控制为准。1. 可复现流水线:密钥、钥匙串与 Runner 边界
云 Mac 强调无人值守与镜像重置:凡依赖「手动点钥匙串允许」都会在下次实例复发。把分发证书与私钥放进专用钥匙串文件,Job 开头用 security 设定搜索顺序、默认钥匙串与解锁;口令只走 CI 秘密变量。公证轮询受出口网络影响,若同机还跑 VPN,默认路由可能与 WireGuard 跨境远控排障文 所述非对称路由叠加,需一并排查。
2. codesign:分层校验与 Hardened Runtime
对 app 与嵌套目标跑 codesign --verify --deep --strict,必要时 spctl --assess 预检 Gatekeeper。隐性失败多来自子二进制漏签、entitlements 与 capability 漂移,或脚本改写已签 bundle。签名顺序建议写死:先子后主、再验签;第三方二进制须在你的证书链下或改为 xcframework。若同机用 Docker 构建缓存,勿把宿主钥匙串 bind 到与用户上下文不一致的容器,以免「见证书不解私钥」。
3. Notarization 与 stapler:提交、通过、装订
用 xcrun notarytool store-credentials 建 profile,再 submit + wait 拉结构化日志。通过后对最终分发的那份包执行 stapler staple;装订失败常见是包体在公证后被改动。把 submission id 与状态打进构建日志,便于与 Connect 工单对齐。
# 示意:提交并等待(具体 profile 名与路径按项目替换)
xcrun notarytool submit ./MyApp.zip --keychain-profile "AC_NOTARY" --wait
xcrun stapler staple ./MyApp.zip
xcrun stapler validate ./MyApp.zip
4. 常见拒绝码与症状—动作(速查)
下表用于先归类:左列贴日志关键词,右列为首选动作(细节以 Apple 文档为准)。
| 症状 / 日志线索 | 高概率根因 | 首选动作 |
|---|---|---|
errSecInternalComponent / 用户交互不允许 |
钥匙串 ACL、未解锁或搜索顺序不对 | 专用钥匙串;security set-key-partition-list;确认无 GUI 弹窗依赖 |
code object is not signed at all / nested code |
嵌套二进制漏签或签名被破坏 | codesign --verify --deep;按依赖树补签;检查复制脚本是否改写 bundle |
notarytool Invalid |
Runtime / entitlements 与公证策略不符 | 按日志条目逐项收紧;删掉不必要的宽 entitlement |
stapler staple 失败 / validate 红 |
公证对象与本地文件不一致或未通过 | 对同一未改动包重试;确认先 wait 成功再装订;检查是否二次压缩改 checksum |
| 上传 App Store / TestFlight 被拒(ITMS-xxxx) | 元数据、隐私清单、架构切片与签名策略 | 以 Transporter / Xcode Organizer 详细为准;同步更新隐私原因字符串与 PrivacyInfo.xcprivacy |
5. 结语
云 Mac 上的 CI,要把钥匙串、证书、profile、notarytool 与 stapler 顺序写成可声明的 Runbook,镜像升级后做一次冷启动签名校验,让红构建尽量只反映产品变更。
在云端 Mac mini 上,签名与公证更省心
Apple Silicon 统一内存让 Xcode、模拟器与 notarytool 轮询并发时更不易触顶;macOS 原生工具链与钥匙串语义一致,减少「Linux Runner + macOS 远程」的双栈心智负担。独占云 Mac 能把构建峰值与磁盘 I/O 从共享邻居中隔离,长期无人值守稳定性更好;Gatekeeper、SIP 与系统完整性降低供应链被篡改面;M 系列能效高、体积小,总拥有成本常优于为每台笔记本单独买 Apple Care + 固定机位。
若你正把 iOS/macOS CI 迁到可预期、可复现的 Apple Silicon 环境,kvmboot 云端 Mac mini M4 是目前性价比很高的起点——立即了解套餐方案,让 codesign 与公证不再绑在某一台个人电脑上。