在一些项目里,证书问题并不会在开发初期暴露,而是在团队协作、换电脑、接入 CI 时突然出现。
比如新同事拉代码后无法打包,CI 构建失败但本地正常,描述文件更新后签名失效,这些问题的共同点是证书并没有管理,而是停留在某一台设备里。
这篇文章讲解如何让 iOS 签名环境可以被复制、迁移和复用
先明确证书不是一个文件
iOS 签名涉及三类文件:
| 类型 | 作用 |
|---|---|
.cer | 公钥证书 |
| 私钥 | 本地生成 |
.p12 | 证书 + 私钥 |
关键点在于:
.cer不能单独使用.p12才是完整可迁移的格式
如果团队成员之间只传 .cer,就会出现:
- 证书存在
- 但无法签名
不让每个人各自生成证书,而是统一生成并分发
可以按以下步骤执行:
步骤 1:生成证书(一次)
在工具中创建证书,而不是在钥匙串里手动生成。
使用 AppUploader(开心上架):
- 打开证书管理
- 点击新增
- 选择类型(development 或 distribution)
- 输入证书名称
- 设置 P12 密码
- 生成并下载
.p12
这一步的结果是:
- 一个完整的 P12 文件
- 不依赖某一台 Mac
步骤 2:保存证书
将 .p12 存储到:
- Git 私有仓库(加密)
- CI Secret
- 内部文件服务
步骤 3:统一使用
在各环境中导入:
- macOS → 钥匙串
- CI → 脚本导入
描述文件的同步方式
证书只是签名的一部分,还需要描述文件。
描述文件绑定:
- Bundle ID
- 证书
生成流程:
- 打开 AppUploader
- 进入描述文件管理
- 新建描述文件
- 选择类型(App Store / Development)
- 绑定 Bundle ID
- 选择证书
- 下载
.mobileprovision
将描述文件与 .p12 一起保存。
在 CI 中加载证书
当项目接入 CI 时,需要让构建环境加载证书。
示例(Fastlane):
import_certificate(
certificate_path: "cert.p12",
certificate_password: "password"
)
描述文件可以通过:
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
这样 CI 可以直接完成签名。
避免证书失效的一个细节
证书本身有有效期(通常一年)。
但在团队中,真正影响的是:
- 描述文件是否使用了旧证书
当证书更新后,需要:
- 重新生成描述文件
- 替换 CI 中的文件
- 重新打包
如果只更新证书而不更新描述文件,会出现签名失败。
跨平台开发中的处理方式
在 Windows 或 Linux 环境中:
- 无法使用钥匙串
- 但可以直接使用
.p12
例如:
- HBuilderX 打包
- CI 构建
- 命令行上传
证书只作为文件存在,不依赖系统工具。
如何判断当前证书是否可用
可以通过以下方式验证:
方法一:Xcode
- 查看证书是否包含私钥
方法二:命令行
security find-identity -v -p codesigning
方法三:打包验证
- 能否成功导出 IPA
证书问题的复杂性,并不是创建步骤,而是它如何被保存和使用。如果证书以 .p12 的形式统一管理后,会少很多问题