团队怎么共用 iOS 证书?p12 证书安全分发、轮换与续期
最后更新
团队共用 iOS 证书,最稳妥的做法是:发布证书全团队只用一张,由账号持有人或管理员创建;导出的 .p12 用强密码保护,文件和密码分两条渠道交给需要的人和构建机;到期前一个月按清单换新证书、重做描述文件、替换所有机器上的文件。
下面把角色权限、分发方式、每台机器怎么放、续期轮换步骤和有人离职时的处理都写成可以照做的清单,末尾附一张资产登记表模板。Apple 规则截至 2026 年 10 月。
还没有证书和描述文件的,先按在 Windows 上申请 iOS 开发证书、描述文件和 p12申请。证书、描述文件、Bundle ID 之间的关系见 Bundle ID、App ID、Team ID、证书和描述文件的关系。
共用 iOS 证书有什么好处?
Apple 的证书概览写明两点。
- 发布证书属于团队。 每个团队每种发布证书只允许一个(Developer ID 除外),只有账号持有人(Account Holder)或管理员(Admin)能创建。
- 开发证书属于个人。 后台的开发证书名称后面会附上电脑名,例如
Gita Kumar (Work Mac),方便区分是谁的哪台电脑。
所以发布证书本来就该是一张,由一个人申请,导出 .p12 后分发给需要出包的同事和构建机。各自去后台点加号的结果通常是这样的。
- 后台不让再建,或者有人为了腾位置吊销了别人正在用的那张,所有基于它的描述文件立即失效,同事手上的 Ad Hoc 包全部打不开。
- 描述文件里勾的证书和你机器上的 .p12 对不上,构建报找不到匹配的证书,排查时没人说得清哪张是谁的。
- 私钥散落在几个人的电脑里,有人离职时不知道要换哪张。
开发证书可以每人一张,也可以共用,取舍见下一节。
团队里谁能创建和管理证书?
机构账号的成员在 App Store Connect 的「用户和访问」里管理。下表摘自 Apple 的角色说明,只列和证书、描述文件相关的几行。
| 操作 | Account Holder | Admin | App Manager | Developer |
|---|---|---|---|---|
| 创建和吊销开发证书 | 可以 | 可以 | 需授予证书后台访问权限 | 需授予证书后台访问权限 |
| 创建和吊销发布证书 | 可以 | 可以 | 需授予证书后台访问权限 | 不可以 |
| 创建开发描述文件 | 可以 | 可以 | 需授予证书后台访问权限 | 只能通过 Xcode 自动签名 |
| 创建和删除发布描述文件 | 可以 | 可以 | 需授予证书后台访问权限 | 不可以 |
| 下载描述文件 | 可以 | 可以 | 需授予证书后台访问权限 | 需授予证书后台访问权限 |
| 添加设备 UDID | 可以 | 可以 | 需授予证书后台访问权限 | 只能通过 Xcode 自动签名 |
| 生成 App Store Connect API 密钥 | 可以 | 可以 | 不可以 | 不可以 |
表里的「证书后台访问权限」指 Certificates, Identifiers & Profiles 的访问权限,在 App Store Connect 的「用户和访问」里给成员单独勾选。另外,Apple 的吊销权限说明写明:每个成员都能吊销自己的开发证书;账号持有人和管理员能吊销其他成员的开发证书和发布证书;管理员不能吊销账号持有人本人的开发证书。
按这张表分工。
- 证书负责人 由一位管理员担任,负责创建发布证书、生成和更新所有描述文件、登记设备、维护下文的资产登记表。再指定一位备份负责人,避免一个人休假时没人能处理。
- 普通开发者 给 Developer 角色就够了。需要自己下载描述文件的,再给证书后台访问权限。
- 个人账号 只有持有人一个人,所有事都由你来做。
开发证书每人一张还是共用一张
| 方式 | 适合 | 好处 | 代价 |
|---|---|---|---|
| 每人一张开发证书 | 人员流动较多、成员有证书后台权限 | 离职时只吊销他那一张,不影响别人;后台能看出是谁签的包 | Development 描述文件要勾选所有人的证书,每加一个人都要重新生成并分发 |
| 全团队共用一张开发证书 | 三五个人的小团队、成员只有 Developer 角色 | 只维护一个 .p12,描述文件不用随人员变动 | 任何一个人离职都要换证书,所有人同时替换 |
Development 描述文件可以同时勾选多张开发证书,一份文件大家共用,所以每人一张证书的方案不需要每人一份描述文件。
分发 p12 有哪几种安全渠道?
.p12 里有私钥,拿到 .p12 和密码的人就能以团队的名义签名。按下面几条来做。
用足够强的导出密码
导出 .p12 时设一个随机生成的长密码,不要用 123456 或公司名。可以让密码管理器生成,也可以用 OpenSSL 生成一个 32 位的随机串。
1$openssl = "C:\Program Files\Git\mingw64\bin\openssl.exe"
2& $openssl rand -base64 24
GitLab 的 Masked 变量要求值至少 8 个字符,密码太短在 CI 里设不上遮挡,这也是用长密码的一个理由。
文件和密码分开传
- .p12 文件放在团队保险库或加密共享盘里,密码通过另一条渠道单独告诉对方,例如密码管理器的共享条目,或者当面、电话。
- 不要把 .p12 和密码放在同一封邮件、同一条聊天消息里。聊天记录和邮件会被同步到很多设备上,也很难彻底删除。
- 不要用公开网盘链接传 .p12。
存在密码管理器或团队保险库里
1Password、Bitwarden 这类密码管理器都支持团队共享保险库,可以附加文件。建一个只给证书负责人和出包同事访问的保险库,每张证书一个条目。
| 条目字段 | 填什么 |
|---|---|
| 附件 | distribution.p12(必要时附上合成它用的私钥 ios.key) |
| 密码 | .p12 的导出密码 |
| 备注 | 证书类型、Team ID、到期日、序列号、创建人、创建日期 |
| 关联条目 | 用到这张证书的描述文件、CI 里对应的 Secret 名称 |
描述文件本身不含私钥,可以和证书放在一起,也可以直接提交在仓库里,见 Jenkins、GitLab CI 自动打包的说明。
不要提交到 Git
工程目录下的 keychain 目录里有 .p12 和 password.properties,一定要加进 .gitignore。下面几行把证书目录、私钥和密码文件都挡在仓库外。
1# 证书目录,含私钥和密码
2keychain/
3
4# 散落在别处的签名文件
5*.p12
6*.p8
7*.key
8password.properties
*.p8 是 App Store Connect API 密钥和 APNs 密钥的私钥,同样不能进仓库。已经误提交过的,从 .gitignore 里加上并不会把它从历史里删掉,要把这张证书当作已泄露,按下文的轮换步骤换新证书。
CI 用 Secrets
构建机上的证书放进 CI 系统的密钥管理,构建时临时写进一个证书目录,用构建设置 CODE_SIGN_KEYCHAIN 指向它,构建结束后删除。把发布证书的 Secret 限定在受保护的分支和 tag 上,普通分支的流水线拿不到私钥。
GitHub Actions 的做法见 GitHub Actions 用自托管 Linux runner 构建 iOS App,上传用的 API 密钥怎么存见用 App Store Connect API 密钥自动上传 ipa。
每台开发机上证书怎么放?
在 Windows、Linux 上用 KXBuild 构建时,把 .p12、.mobileprovision 和密码文件 password.properties 放进 keychain 证书目录,规则以证书与签名为准。证书目录可以放在两个位置,两处的证书会合并使用。
| 位置 | 作用 | 适合放什么 |
|---|---|---|
工程目录/keychain/ |
只对这个工程生效 | 只有这个工程用的描述文件 |
KXBUILD_HOME/keychain/ |
所有工程共用。默认 Windows 是 %USERPROFILE%\kxbuild\keychain\,WSL、Linux、macOS 是 ~/kxbuild/keychain/ |
团队共用的开发证书、发布证书 |
团队共用的 .p12 建议放在 KXBUILD_HOME/keychain/,每台机器放一次,所有工程都能用,也不会因为忘了写 .gitignore 把私钥带进仓库。
1keychain\
2├─ development.p12
3├─ distribution.p12
4├─ MyApp_Dev.mobileprovision
5├─ MyApp_AppStore.mobileprovision
6└─ password.properties
password.properties 每行一张证书,格式为「文件名=密码」,文件名和 .p12 完全一致,密码不加引号。
1development.p12=从保险库复制的密码
2distribution.p12=从保险库复制的密码
用 Windows 记事本编辑 password.properties 时,保存为 UTF-8 编码,并注意行尾不要多出空格。在 WSL 里构建的,证书目录是 WSL 里的 ~/kxbuild/keychain/,从 Windows 复制文件的方法见证书与签名。
放好之后每次构建按工程中的签名设置自动签名,证书类型看 CODE_SIGN_IDENTITY,团队看 DEVELOPMENT_TEAM,描述文件在自动签名时按 Bundle ID 和团队匹配,选择规则见证书与签名。连上手机构建并安装一次,确认放对了。
1kxbuild build .\MyApp.xcodeproj --install
和 Mac 同事共用同一套证书
同一张 .p12 可以同时给 Mac 同事和 Windows、Linux 同事用,不需要为不同系统各申请一张。
- Mac 同事 双击 .p12 导入「钥匙串访问」,Xcode 就能用它签名。macOS 上用 KXBuild 的,也可以直接用系统钥匙串里的证书。导入时提示密码错误的,多半是 OpenSSL 3 默认的加密格式不被识别,按 140 篇的合成 p12 一节加
-legacy重新导出一份。 - Windows、Linux 同事 把同一个 .p12 放进 keychain 证书目录,写好 password.properties。
- 工程里的签名设置 两边共用,不要各改各的。
DEVELOPMENT_TEAM、签名方式和CODE_SIGN_IDENTITY提交在 project.pbxproj 里,Mac 同事改了签名设置要在群里说一声。
共用仓库的其他约定,例如 .gitignore 的完整写法、scheme 要勾 Shared,见把 Xcode 项目搬到 Windows 上开发,和 Mac 同事共用一个仓库。
证书到期前怎么轮换和续期?
证书到期、私钥可能泄露、持有私钥的人离职,这三种情况都要换新证书。流程一样,区别只在急不急。
到期前多久准备
- 证书和描述文件的到期日在后台 Certificates、Profiles 页能看到,也可以用 OpenSSL 直接查本地文件,命令见证书过期或被吊销会怎样的查看到期时间一节。
- 把每张证书、每个描述文件的到期日记进团队日历,提前一个月提醒证书负责人。
- 续期安排在两次发版之间,避开正在提交审核、正在跑 TestFlight 或 Ad Hoc 测试的时间段。
到期和吊销分别会影响什么,先看 iOS 证书过期或被吊销会怎样,评估清楚再动手。要点是:会员资格有效时,发布证书过期或吊销不影响 App Store 上已有的 App;吊销会让包含这张证书的描述文件立即失效,Ad Hoc 包和开发包随之打不开。
续期步骤清单
| 步骤 | 谁做 | 做什么 | 完成标志 |
|---|---|---|---|
| 1. 新建证书 | 证书负责人 | 生成 CSR(可沿用原私钥),在 Certificates 页建同类型的新证书,合成新 .p12,设新的强密码 | 保险库里有新条目,备注写好到期日 |
| 2. 重新生成描述文件 | 证书负责人 | 在 Profiles 页逐个编辑用到旧证书的描述文件,改选新证书,保存并下载。主 App 和每个扩展、Development、Ad Hoc、App Store Connect 都要处理 | 登记表里每份描述文件都更新了日期 |
| 3. 分发新 p12 | 证书负责人 | 把新 .p12 和描述文件放进保险库,密码另行通知,告知替换截止日期 | 所有持有人确认收到 |
| 4. 替换各机器 | 每位持有人 | 删掉 keychain 目录里的旧 .p12 和旧描述文件,放入新文件,更新 password.properties | 目录里只剩新文件 |
| 5. 替换 CI | CI 负责人 | 更新 .p12、密码、描述文件三个 Secret | 流水线读到的是新证书 |
| 6. 验证构建 | 每位持有人和 CI | 开发包装到手机能打开;Release 包加大构建号后上传 App Store Connect 成功 | 登记表上逐个打勾 |
| 7. 处理旧证书 | 证书负责人 | 正常到期的让它自然过期;泄露或离职的,确认第 6 步全部通过后立即吊销 | 后台只剩新证书 |
第 1 步的 CSR 和 .p12 命令见 140 篇的续期一节。第 6 步可以直接用下面两条命令。
1kxbuild build .\MyApp.xcodeproj --install
2kxbuild build .\MyApp.xcodeproj -c Release --export app-store
旧证书还有效时后台不让新建同类型的发布证书,就只能先吊销旧证书再建。这时把第 7 步提到最前面,选一个不发版的时间窗口,提前通知测试人员 Ad Hoc 包会暂时失效,然后一口气做完第 1 到第 6 步。
第 4 步一定要删旧文件。目录里新旧两份同时存在时容易用错,报错也更难排查,对应的报错和处理见 iOS 签名报错与 ipa 安装失败。
有人离职当天要做哪些事?
离职当天由账号持有人或管理员按顺序处理。
-
移除团队成员。 在 App Store Connect 的「用户和访问 → 人员」里点开这个人,点左下角的「删除」并确认。Apple 的添加和编辑用户帮助页写明,这一步需要账号持有人或管理员角色,缓存最长要 10 分钟才会完全收回访问权限。机构账号的开发者成员也是在这里管理,见 Apple 的删除团队成员。
-
吊销他的开发证书。 在 Certificates 页按名称和电脑名找到他的开发证书并吊销。吊销后包含这张证书的描述文件会失效,去 Profiles 页重新生成共用的 Development 描述文件,取消勾选他的证书,分发给其他人。
-
轮换他接触过的发布证书。 他拿到过发布证书的 .p12 和密码,就要把这张证书当作已经泄露,按上一节的续期清单换新证书,验证通过后吊销旧证书。团队共用一张开发证书的,同样要换。
-
撤销 API 密钥。 在 App Store Connect 的「用户和访问 → 集成 → App Store Connect API」里,撤销他创建的个人密钥,以及他下载过 .p8 的团队密钥,再生成新的团队密钥更新到 CI。
Apple 的 App Store Connect API 帮助页写明,密钥撤销后不能恢复,丢失或泄露要立即撤销。推送用的 APNs .p8 密钥他也接触过的,同样在开发者后台的 Keys 页换新,见推送 p8 与 p12 怎么选。
-
更换保险库和 CI 的访问。 把他从团队保险库、CI 系统、构建机账号里移除,修改他知道的共享密码。
-
收回设备。 他用的测试机归还后,在开发者后台禁用不再使用的 UDID。
-
更新登记表。 把他名下的每一行改成新的持有人,或者标记为已吊销。
Apple 的帮助页没有说明移除成员后他创建的证书会怎样,不要指望删除成员就让证书自动失效,第 2 到第 4 步要手动做。
资产登记表模板
把团队所有签名相关的资产登记在一张表里,放进团队保险库或只有证书负责人能编辑的文档。每次新建、分发、轮换、吊销都更新这张表,离职和续期时照着表逐行处理。
| 资产 | 类型 | 到期日 | 创建人 | 保管位置 | 持有人和机器 | 关联描述文件 | 上次轮换 |
|---|---|---|---|---|---|---|---|
| distribution.p12 | Apple Distribution 证书 | 2027-03-01 | 王工(Admin) | 保险库「iOS 签名」条目 1 | 王工 Windows 笔记本、李工 MacBook、CI Secret IOS_P12_BASE64 |
MyApp_AppStore、MyApp_AdHoc | 2026-03-01 |
| development.p12 | Apple Development 证书(共用) | 2027-02-10 | 王工 | 保险库条目 2 | 王工、李工、张工的开发机 | MyApp_Dev | 2026-02-10 |
| MyApp_AppStore.mobileprovision | App Store Connect 描述文件 | 2027-03-01 | 王工 | 保险库条目 1、仓库 signing/ |
同 distribution.p12 | — | 2026-03-01 |
| AuthKey_ABC123.p8 | App Store Connect API 团队密钥(App 管理) | — | 王工 | 保险库条目 3 | CI Secret | — | 2026-06-15 |
| AuthKey_XYZ789.p8 | APNs 密钥 | 不过期,可吊销 | 王工 | 保险库条目 4 | 推送服务器 | — | 2026-01-20 |
表里的人名、日期都是示例,换成你团队的实际情况。「持有人和机器」一列最重要,团队共用 iOS 证书时,离职或泄露都要靠它知道去哪些地方替换文件。
常见问题
团队里每个人都要申请自己的 iOS 发布证书吗?
不需要。Apple 写明发布证书属于团队,每个团队每种发布证书只允许一个,由账号持有人或管理员创建后导出 .p12,分发给需要出包的同事和构建机即可。
Developer 角色能自己创建证书和描述文件吗?
Developer 角色在被授予证书后台访问权限后,可以创建和吊销自己的开发证书、下载描述文件,但不能创建发布证书和发布描述文件,这些要由账号持有人、管理员,或有证书后台访问权限的 App Manager 来做。
p12 证书怎么安全地发给同事?
把 .p12 放进密码管理器的团队保险库或加密共享盘,密码通过另一条渠道单独告诉对方,不要放在同一封邮件或同一条聊天消息里,也不要提交到 Git 仓库。
同事离职后要重新申请 iOS 证书吗?
他拿到过 .p12 和密码的证书都要换新,并撤销他接触过的 API 密钥。先在 App Store Connect 移除他,再按续期清单生成新证书和描述文件,所有机器和 CI 验证通过后吊销旧证书。
换了新证书,之前上架的 App 会受影响吗?
不会。Apple 写明只要开发者计划会员资格有效,发布证书过期或吊销都不影响 App Store 上已有的 App,但用旧证书签名、还没提交审核的构建可能被标为无效,要用新证书重新构建上传。