4. 签名证书管理

说到签名证书,其实就是你和苹果之间的握手信物。没有它,应用就是黑户,上不了架也装不了机。我见过太多新手在这上面栽跟头,今天咱们就掰开揉碎聊聊。

证书管理,说白了就是三件事:用什么类型的证、谁给你发证、证放哪儿怎么导。嗯,听着简单,坑可不少。

证书类型:开发 vs 发布

苹果把证书分两大类,开发证书和发布证书。名字很直白,用途天差地别。

证书类型 用途 有效期 设备限制
iOS Development 真机调试、开发测试 1年 最多100台
iOS Distribution App Store上架、Ad Hoc分发 1年 Ad Hoc最多100台
iOS Distribution (In-House) 企业内部应用分发 3年 无限制(需企业账号)
我的习惯:Xcode里选证书时,优先用自动管理。但手动模式我更喜欢,因为能控制每个证书对应的Provisioning Profile。团队协作时,手动管理更靠谱。

证书颁发机构:苹果的验证体系

谁给你发证?苹果。但中间有个环节很多人忽略——证书颁发机构(CA)。苹果自己就是CA,它的根证书预装在所有iOS设备里。你生成CSR时,其实就是告诉苹果“我是谁,我要干嘛”。

流程是这样的:

  1. 你在Mac上生成密钥对(私钥+公钥)
  2. 公钥打包成CSR(证书签名请求)
  3. 苹果验证你的开发者账号身份
  4. 苹果签名你的CSR,返回证书
  5. 证书绑定你的公钥,私钥留在你本地
踩坑警告:我曾经不小心删了Keychain里的私钥,结果证书作废。重新生成证书后,所有旧版本App的推送通知全失效了。私钥丢了,就再也找不回来。

Keychain:你证书的老家

所有证书和私钥都住在macOS的Keychain里。你可以打开钥匙串访问应用看看。别被名字吓到,其实就是个加密数据库。

Keychain里不止有证书,还有你的私钥、Provisioning Profile甚至各种密码。每个证书都对应一个私钥,没有私钥的证书就是一张废纸。

关键认知:证书可以公开,私钥必须保密。团队协作时,私钥分发给信得过的同事,别用明文传输。AirDrop或内网加密文件都可以,但不建议用微信传。

我习惯用三个Keychain概念:

  • 登录钥匙串:你的个人证书和私钥
  • 系统钥匙串:系统级证书
  • 自定义钥匙串:团队用,可以独立存储某项目的证书

证书导入导出:团队的交接艺术

证书要在团队间流转,就得导出导入。苹果搞了个.p12格式,其实就是加密打包的证书+私钥。

导出步骤:

  1. 打开钥匙串访问
  2. 找到你的证书(开发或发布)
  3. 右键导出,选.p12格式
  4. 设置一个强密码(至少12位)
  5. 发给同事
# 命令行导出方式
# 先找到证书名称
security find-identity -v -p codesigning

# 导出指定证书为.p12
security export -k ~/Library/Keychains/login.keychain-db \
                -t certs -f pkcs12 \
                -o MyCert.p12 \
                -P "YourPassword123"

导入时双击.p12文件,输入密码就行。但有个坑:如果电脑上已有相同证书,钥匙串会问你是否替换。替换可能导致其他项目出问题。

避坑指南:我曾经用CI/CD自动构建时,证书和密钥分离存储。私钥放在密码管理器里,构建时动态解密。这样即使CI服务器被攻破,私钥也不是明文。

证书的完整生命周期

证书不是永生的。你得掌握它从生到死的全过程。下面这张图展示了证书管理的核心流程:

签名证书全生命周期管理 1. 生成密钥对 私钥留本地,公钥打包 2. 创建CSR 证书签名请求 3. 苹果颁发 CA验证并签名 4. 证书落地 存入Keychain 开发证书 真机调试、开发测试 发布证书 App Store/Ad Hoc/In-House 导出为.p12 加密私钥+证书 导出为.p12 团队协作使用 证书到期/撤销 重新生成 证书到期/撤销 推送功能全失效 私钥必须严格保密 证书到期前30天提醒续期 多个开发证书互不冲突
重要时间节点:
  • 开发证书:每年到期前一个月开始走续期流程
  • 发布证书:同样每年更新,但App Store的已发布应用不受影响
  • 企业证书:3年有效期,提前2个月向苹果申请续期
我习惯在日历上设提醒,提前45天提醒续期。别问我怎么知道的——有一次忘了续期,团队三天没法发布热更新。

多证书环境怎么管

团队大了,证书就多了。开发、测试、发布、企业,每个环境都要独立证书。我见过有人把所有证书混着用,结果测试版和正式版签名混了,审核被拒。

建议这样做:

  • 每个证书一个.p12文件,命名规则:项目名_环境_日期.p12
  • 钥匙串里用文件夹组织,比如“XX项目开发”、“XX项目发布”
  • 证书和Provisioning Profile配对存放
  • CI/CD服务器用独立钥匙串,别和开发环境共用
千万别这么干:一个证书签多个App。虽然技术上可行,但一旦某个App出问题,所有App都会被牵连。我曾经接手一个项目,十几个App全用一个证书签名,后来证书被撤销,全公司紧急加班了一周。

证书与合规的那些事

合规不只是嘴上说说。苹果对证书管理有明确要求,尤其是企业证书。滥用企业证书分发个人应用,严重者会被封号。

我参与过一个合规审计,对方要求:

  • 所有证书必须登记使用人
  • 私钥加密存储,访问有日志
  • 证书到期前必须有续期计划
  • 离职人员证书立即撤销

你想想看,如果真出了安全问题,审计发现你连证书记录都没有,那才叫麻烦。

嗯,关于签名证书管理,核心就是这些。证书无小事,一步错步步错。私钥、密码、有效期,哪个都不能马虎。