跳到主要内容
教程目录

团队怎么共用 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 安装失败。

有人离职当天要做哪些事?

离职当天由账号持有人或管理员按顺序处理。

  1. 移除团队成员。 在 App Store Connect 的「用户和访问 → 人员」里点开这个人,点左下角的「删除」并确认。Apple 的添加和编辑用户帮助页写明,这一步需要账号持有人或管理员角色,缓存最长要 10 分钟才会完全收回访问权限。机构账号的开发者成员也是在这里管理,见 Apple 的删除团队成员。

  2. 吊销他的开发证书。 在 Certificates 页按名称和电脑名找到他的开发证书并吊销。吊销后包含这张证书的描述文件会失效,去 Profiles 页重新生成共用的 Development 描述文件,取消勾选他的证书,分发给其他人。

  3. 轮换他接触过的发布证书。 他拿到过发布证书的 .p12 和密码,就要把这张证书当作已经泄露,按上一节的续期清单换新证书,验证通过后吊销旧证书。团队共用一张开发证书的,同样要换。

  4. 撤销 API 密钥。 在 App Store Connect 的「用户和访问 → 集成 → App Store Connect API」里,撤销他创建的个人密钥,以及他下载过 .p8 的团队密钥,再生成新的团队密钥更新到 CI。

    Apple 的 App Store Connect API 帮助页写明,密钥撤销后不能恢复,丢失或泄露要立即撤销。推送用的 APNs .p8 密钥他也接触过的,同样在开发者后台的 Keys 页换新,见推送 p8 与 p12 怎么选。

  5. 更换保险库和 CI 的访问。 把他从团队保险库、CI 系统、构建机账号里移除,修改他知道的共享密码。

  6. 收回设备。 他用的测试机归还后,在开发者后台禁用不再使用的 UDID。

  7. 更新登记表。 把他名下的每一行改成新的持有人,或者标记为已吊销。

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,但用旧证书签名、还没提交审核的构建可能被标为无效,要用新证书重新构建上传。