Apple Certificate 是由 Apple Developer Portal 颁发的数字文档,用于为 iOS、iPadOS、macOS、tvOS 和 watchOS 应用程序签名代码。根据 Apple Developer Support, 2026,证书是公钥基础设施 (PKI) 的一部分,对于确认开发者的身份至关重要。本文将介绍证书的类型、创建和管理过程。
要点
Apple Certificate 是由 Apple 证书颁发机构 (Apple Certificate Authority) 颁发的 X.509 格式加密证书。它证明持有者是 Apple Developer Program 的注册成员,有权为 Apple 生态系统签名应用程序。证书由公钥、所有者元数据和 Apple CA 的数字签名组成 — 任何人都可以使用操作系统内置的 Apple 根证书来验证证书的真实性。
Apple PKI 架构包括三个层次:Apple 根证书 (Apple Root CA)、中间证书 (Apple Worldwide Developer Relations CA) 和开发者证书。Apple Worldwide Developer Relations CA 签名所有开发者证书 — 如果信任链中缺少此中间证书,代码签名将被视为无效。Apple 根证书通过内置于 iOS 和 macOS 中的 Apple Trust Store 机制自动更新。
每个证书都有有效期 — 从一年到三年,具体取决于类型。Apple Developer Program 会在证书到期前 30 天通过电子邮件和推送通知自动通知开发者。到期后,旧证书不能再用于签名新的构建版本 — 需要颁发新证书,但使用过期证书签名的应用程序仍可在用户设备上继续运行。
信任链 确保开发者证书确实由 Apple 颁发。iOS 会检查:Apple Root CA 根证书(内置于固件中)、Apple Worldwide Developer Relations CA 中间证书、开发者证书。如果信任链中任何元素缺失或无效,iOS 将阻止应用程序启动并显示代码签名错误。macOS 提供 security 工具来检查钥匙串中任何证书的信任链。
使用 Apple Certificate 进行代码签名的过程基于非对称加密。私钥 (private key) 存储在开发者计算机的 Keychain 中,而公钥 (public key) 则包含在证书中并发送到 Apple Developer Portal。当 Xcode 签署应用程序时,它会创建二进制文件的哈希值并使用私钥加密 — 这就是数字签名。设备使用证书中的公钥解密签名,并与计算出的哈希值进行比较。
Apple 对 2021 年后颁发的所有证书使用 ECDSA(椭圆曲线数字签名算法),采用 P-256 曲线。之前使用的是 RSA-2048。迁移到 ECDSA 提高了设备上的签名验证速度并减小了签名大小 — 对于移动应用程序来说,这尤为重要,因为每次启动时都会进行签名验证。根据 Apple Security Engineering (2025),ECDSA P-256 在计算成本显著降低的情况下提供了与 RSA-2048 同等的安全级别。
对于 CI/CD 流程,证书连同私钥需要导出为 PKCS12 (.p12) 格式并存储在安全存储中。GitHub Actions、Bitrise、Jenkins 和其他 CI 系统支持通过环境变量或密钥导入证书。导入到 CI 代理后,证书会临时添加到钥匙串中,用于签名,然后被删除。Fastlane Match 可自动执行此过程,通过加密的 git 存储库在开发者之间同步证书。
Development 证书允许签名应用程序以在开发者的物理设备上运行。获取它只需要一个免费的 Apple ID 帐户 — Xcode 可以自动生成 Development 证书。Distribution 证书仅针对付费的 Apple Developer Program 帐户(每年 99 美元)颁发,用于将应用程序提交到 App Store、Ad Hoc 分发或 Enterprise 分发。一个帐户可以有多个 Distribution 证书 — 例如,为每个应用程序或不同团队分别设置。
Apple Developer Portal 提供多种类型的证书,每种证书针对特定任务设计。iOS App Development — 开发阶段签名应用程序的基本证书。Apple Distribution — 在 App Store 发布的主要证书。Mac Development 和 Mac Distribution — 分别对应 macOS 应用程序。每种证书类型在 Apple Developer Portal 中都有单独的请求 (CSR)。
单独的一类是推送通知证书。Apple Push Notification service (APNs) 需要单独的 SSL 证书或使用身份验证令牌 (APNs Auth Key)。APNs SSL 证书分别针对 Development (Sandbox) 和 Production 环境颁发,并绑定到特定的 App ID。APNs Auth Key — 更现代的方法:一个密钥 (.p8) 服务于帐户的所有应用程序,简化了管理。
| 证书类型 | 用途 | 有效期 |
|---|---|---|
| iOS App Development | 在设备上测试的签名 | 1 年 |
| Apple Distribution | 在 App Store 发布和 Ad Hoc | 1 年 |
| Mac Development | 开发用 macOS 应用程序签名 | 1 年 |
| Mac Distribution | 在 Mac App Store 发布 | 1 年 |
| APNs SSL (Sandbox) | 测试环境中的推送通知 | 1-3 年 |
| APNs SSL (Production) | 生产环境中的推送通知 | 1-3 年 |
创建 Apple Certificate 始于通过 macOS 上的 Keychain Access 生成证书签名请求 (CSR)。Keychain Access 会创建一对密钥:私钥保留在钥匙串中,CSR 发送到 Apple Developer Portal。身份验证后,Apple 签署 CSR 并颁发准备好的证书 (.cer),需要下载并双击安装。
为了管理多个项目和团队,Apple 允许为不同的 Team ID 创建证书。一个开发者可以成为多个团队的成员(通过 Apple Developer Program — App Store Connect),并且为每个团队颁发单独的证书。Xcode 会根据 Signing & Capabilities 设置中选择的团队自动切换证书。
吊销证书是一项关键操作:使用此证书签名的所有应用程序将无法再安装到新设备上(已安装的将继续运行)。Apple Developer Portal 允许在 Certificates 部分吊销任何证书。吊销原因:私钥泄露、开发者离开团队、违反 Apple Developer Program 条款。吊销后,需要颁发新证书并重新签名所有活动的构建版本。
Keychain(钥匙串)— macOS 用于存储证书、私钥和密码的系统存储。所有 Apple 证书和相应的私钥都存储在用户的登录钥匙串 (login.keychain) 中。Xcode 在代码签名时访问 Keychain,根据构建类型自动选择合适的证书。要诊断签名问题,请使用内置的 Keychain Access 工具(位于 /Applications/Utilities 文件夹)。
为 CI/CD 导出证书通过 Keychain Access 完成:选择证书和相应的私钥(它们应在同一行中展开),右键单击并选择导出。格式为 PKCS12 (.p12)。导出时 Keychain 会要求输入密码以保护文件 — 此密码在 CI 服务器导入时将需要。没有私钥,导出的证书对签名毫无用处 — 只能用于验证已签名的代码。
使用 security 工具将证书导入 CI 代理钥匙串的示例命令:
# 创建临时钥匙串
security create-keychain -p "temp" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "temp" build.keychain
# 从 .p12 导入证书
security import certificate.p12 -k build.keychain \
-P "${P12_PASSWORD}" -T /usr/bin/codesign
# 配置签名策略
security set-key-partition-list -S apple: -s \
-k "temp" build.keychain
Security create-keychain 创建与用户隔离的临时钥匙串。这对 CI 很重要,以免污染代理的系统钥匙串。-T /usr/bin/codesign 标志允许 codesign 工具无需密码即可访问密钥 — 否则管道中的自动签名将被对话框中断。set-key-partition-list 命令对于兼容 macOS 在自动模式下代码签名的要求是必需的。
最常见的错误 — 在 Xcode 编译时出现 “No signing certificate found”。当 Keychain 中缺少与所选构建类型对应的带私钥的证书时发生。解决方法:检查 Keychain Access 中是否存在证书,从 Apple Developer Portal 下载并安装。如果私钥丢失(旧计算机、系统重装),需要吊销旧证书并颁发新证书。
CI/CD 中的 “Valid signing certificate not found” 错误发生在代理未安装 Apple 中间证书 (Apple Worldwide Developer Relations CA) 时。Apple 在下载开发者证书时会包含中间证书到信任链中,但手动导出 .p12 时它们可能缺失。解决方法 — 从 Apple Certificate Authority 网站下载中间证书并将其安装到 CI 代理的钥匙串中。
证书过期 问题在签名时表现为 “This certificate has an invalid issuer” 错误。Apple Developer Portal 显示每个证书的状态和到期日期。如果应用程序已经在 App Store 中使用过期证书发布,它将继续运行 — App Store 使用自己的 Apple 证书进行分发。但是,要上传新的构建版本,需要有效的 Distribution 证书。Fastlane 包含 cert 命令用于自动创建和更新证书。
常见问题
不可以,iOS 和 macOS 颁发不同类型的证书 — iOS App Development 和 Mac Development。Apple Distribution 证书也按平台划分。在 Apple Developer Portal 中创建证书时,需要指定目标平台 — 不存在适用于所有平台的通用证书。
需要在 Apple Developer Portal 中通过 Certificates, Identifiers & Profiles 吊销旧证书。然后通过 Keychain Access 创建新的 CSR 并颁发新证书。所有使用旧证书签名的应用程序将需要重新签名并重新上传到 App Store,如果需要发布更新。
一个 Apple Developer Program 帐户最多允许同时拥有两个 Distribution 证书和无限数量的 Development 证书。Enterprise 帐户有单独的限额。如果已达到 Distribution 证书的限制,需要在创建新证书之前吊销现有证书之一。
使用 security 工具:security find-identity -v -p basic 将列出钥匙串中所有证书及其到期日期。对于特定证书,指定其 SHA-1 哈希:security find-certificate -c “Developer” -p | openssl x509 -noout -enddate。
是的,证书绑定到特定的 Apple Developer 帐户 (Team ID)。更改帐户时,旧证书对于新 Team ID 将变为无效。Xcode 在 Accounts Preferences 中更改帐户时,会自动提示为新的团队创建新证书。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。