钥匙串访问(Keychain Access)仍然存在于每台 Mac 上,其证书助理(Certificate Assistant)仍然可以生成证书签名请求。但这个请求是否适用于代码签名,完全取决于你要申请的是哪种证书。如果是Apple Developer ID证书,也就是允许你在 Mac App Store 之外分发 Mac 软件所需的证书,那么钥匙串访问就是正确的工具,下面的步骤依然有效。如果是来自公共证书颁发机构(CA)的商业代码签名证书,也就是用于签署 Windows 可执行文件、安装程序、驱动程序和 Java 应用程序的那种证书,那么自 2023 年 6 月 1 日起,钥匙串访问生成的请求已不再被接受,因为私钥现在必须在硬件上生成。
请先确认你需要的是这两者中的哪一种,然后按照对应的部分操作。
你实际要申请的是哪种代码签名证书?
这两种产品都被称为代码签名证书,都能证明软件的发布者身份,但它们来自不同的颁发机构,并遵循不同的规则。读者之所以会看到这篇文章,是因为 Apple 和公共证书颁发机构对两种不同的东西使用了相同的名称。
- Apple Developer ID 证书。 由 Apple 通过其自有的 Developer ID Certification Authority 颁发给 Apple Developer Program 的成员。它用于签署你自行分发的 Mac 应用、插件和安装包,从而让 macOS Gatekeeper 将你识别为经过身份验证的开发者。密钥对在你的 Mac 上生成,并保存在登录钥匙串中,请求由你在钥匙串访问中创建。
- 公开信任的代码签名证书。 从 Sectigo、DigiCert 或 GlobalSign 等公共证书颁发机构购买。它用于签署 Windows 可执行文件、MSI 安装程序、驱动程序、PowerShell 脚本和 Java 应用程序。它受 CA/Browser Forum 代码签名基线要求(Code Signing Baseline Requirements)约束,该要求规定私钥必须在经过认证的硬件上生成并保存,因此钥匙串访问在这里完全派不上用场。
简单的判断规则是:如果你要签署的软件运行在 macOS 上,并且要在 Mac App Store 之外分发,那么你需要的是 Developer ID 证书。如果你要签署的是任何面向 Windows 的软件,或者是 Java 应用程序,那么你需要商业代码签名证书,即使你是在 Mac 上构建它。这两者都不是 SSL/TLS 证书。如果你实际想要的是在 Mac 服务器上启用 HTTPS,请参阅如何在 macOS 服务器上生成 CSR。
商业路径:为什么钥匙串方法已不再适用
自2023 年 6 月 1 日起,CA/Browser Forum 代码签名基线要求规定,所有公开信任的代码签名证书(无论是标准型 OV 还是扩展验证型 EV)的私钥都必须在符合FIPS 140-2 Level 2、Common Criteria EAL4+或同等标准的硬件加密模块中生成并存储,且不可导出。EV 代码签名证书一直都要求使用硬件;2023 年的这项变更将同样的规则扩展到了标准证书。
由证书助理创建的密钥在设计上就无法通过这项测试,原因有三:
- 该密钥是可导出的软件密钥材料。 它被写入你的登录钥匙串,你可以选中它并将其导出为 .p12 文件。这种可移植性对 Apple 开发来说很方便,但恰恰是硬件要求要消除的那种特性。
- 密钥长度不符合要求。 基线要求为代码签名规定了至少RSA 3072 位,而证书助理的密钥大小菜单中根本没有 3072 这个选项。
- 该请求几乎不包含任何身份信息。 证书助理只要求填写通用名称(Common Name)和电子邮件地址。它没有地方可以填写组织、地区、州/省或国家等信息,而这些正是证书颁发机构在颁发组织验证型代码签名证书时需要核实的内容。
这样一来,获取公开信任的代码签名证书就只剩下两种有效方式,而具体采用哪一种是在下单时确定的:
- 令牌加邮寄。 证书颁发机构在其自有的经过认证的 USB 令牌上生成密钥对和请求,将签发的证书写入其中,然后将该令牌邮寄给你。你不需要自己创建或粘贴任何 CSR。参见应该选择哪种代码签名证书交付方式。
- 使用你自己的硬件令牌、HSM 或云 HSM,并提供证明文件。 你在设备内部生成密钥,在设备上生成请求,并提交一份证明文件(attestation file),用以证明该密钥是在符合要求的硬件上创建且无法导出。请参阅YubiKey 5 FIPS CSR 生成与证明指南或Luna Network Attached HSM v7.x CSR 与证明指南,或参考你所使用的 HSM 厂商自己的文档。
还有一项已经生效的变更:投票案 CSC-31 将公开信任的代码签名证书的最长有效期从 39 个月缩短为460 天,适用于自2026 年 3 月 1 日起颁发的证书,因此续订周期现在大约每 15 个月就要进行一次。若想了解更全面的内容,请参阅如何为代码签名证书生成 CSR以及同一指南的 OpenSSL 版本。
在钥匙串访问中为 Apple Developer ID 证书生成 CSR
如果你已经保存了一个 .certSigningRequest 文件,可以直接跳到在你的开发者账户中提交该文件这一部分。
开始之前需要确认两件事。你需要拥有Apple Developer Program会员资格,并且 Apple 要求必须具有账户持有者(Account Holder)角色才能创建 Developer ID 证书。此外,每个团队最多可以拥有五个 Developer ID Application 证书和五个 Developer ID Installer 证书。开发者门户网站要求每次创建证书时都上传一次请求,因此每申请一个证书就需要完整走一遍这个流程。
步骤 1:打开钥匙串访问并开始请求
钥匙串访问已经不再位于大多数教程所说的位置。在 macOS Sonoma 及之前版本中,它位于“应用程序” > “实用工具”中。从macOS Sequoia开始,Apple 将其移动到了/System/Library/CoreServices/Applications/这个系统文件夹中,而当你在“访达”中浏览“应用程序”时并不会显示这个文件夹,所以在“实用工具”中查找已经找不到它了。最快捷的打开方式是使用聚焦搜索(Spotlight)(按Command-Space后输入Keychain Access),或者在终端中输入一条命令:
open "/System/Library/CoreServices/Applications/Keychain Access.app"
打开应用后,在菜单栏中选择“钥匙串访问” > “证书助理” > “从证书颁发机构请求证书”。
在此之前,请先点击项目列表中的空白区域,确保没有选中任何内容。如果某个密钥或证书处于选中状态,该菜单项就会变成“使用……从证书颁发机构请求证书”(跟在该项目名称之后),并且它会基于现有密钥来构建请求,而不是创建新的密钥对。当你确实想重复使用某个密钥时,这个功能很有用,但如果不是这样,就容易造成困惑。

步骤 2:填写“证书信息”窗口
证书助理会打开一个名为“证书信息”的窗格。它要求填写的内容非常少:
- 用户电子邮件地址: 你 Apple 开发者账户上使用的电子邮件地址。
- 通用名称: 密钥对的标签,例如Developer ID Application Key。这并不是最终出现在证书中的名称。Apple 会根据你的团队信息来生成最终颁发证书的主题(subject),格式为Developer ID Application: 你的团队名称 (TEAMID),因此可以把这个字段当作你自己的参考标记。
- CA 电子邮件地址: 留空即可。它只用于另一种交付方式。
- 请求方式: 选择“存储到磁盘”,而不是“电子邮件发送给证书颁发机构”。Apple 的开发者门户接受上传文件的方式。
如果你还想自行选择密钥大小或算法,请在此处勾选“让我指定密钥对信息”。然后点击“继续”。

步骤 3:如果需要,选择密钥对设置
只有当你在步骤 2 中勾选了那个选项时,才会出现这个窗格;对于 Developer ID 证书来说,通常可以跳过这一步。默认设置是RSA、2048 位,这也是 Apple 官方说明中使用的设置。选择 RSA 时,密钥大小菜单会提供 2048、4096 和 8192 位。算法菜单提供 RSA 和 ECC 两个选项,切换到 ECC 后,这些位数会被替换为 256、384 和 521 位。除非你要注册的服务明确要求使用椭圆曲线密钥,否则请将算法保持为 RSA。
本指南早期版本曾建议你在此处至少选择 3072 位。那个数值是 CA/Browser Forum 针对商业代码签名证书规定的最小值,并不适用于 Developer ID,而且这个菜单中也根本没有这个选项可选。点击“继续”。

步骤 4:保存请求并检查其中的内容
选择保存文件的位置,然后点击“存储”。你会得到一个带有.certSigningRequest扩展名的文件,同时证书助理也会将对应的密钥对写入你的登录钥匙串。该文件本身是普通的 PEM 文本,因此你可以用文本编辑(TextEdit)打开并阅读它,尽管编码后的内容本身并不能直观地告诉你太多信息。

在上传之前,可以在终端中解码该请求以确认相关细节。macOS 自带的openssl命令即可完成此操作,虽然它实际上是 LibreSSL 而非正式的 OpenSSL,但无需另行安装:
openssl req -noout -text -in CertificateSigningRequest.certSigningRequest
请检查输出结果中的三项内容:Subject一行应显示你输入的通用名称和电子邮件地址;公钥一行应显示2048 bit(或你所选择的其他位数);签名算法应为 SHA-256。如果你不想使用终端,也可以将文件内容粘贴到我们的CSR 解码工具中查看相同的信息字段。
步骤 5:提交请求并安装证书
登录你的 Apple Developer 账户,打开“证书、标识符和描述文件”(Certificates, Identifiers & Profiles)。在侧边栏中点击“证书”,然后点击添加按钮,在“软件”下选择“Developer ID”。选择你所需要的类型:
- Developer ID Application用于签署 Mac 应用、插件或捆绑包。
- Developer ID Installer用于签署包含已签名应用的 Mac 安装包。
点击“继续”,然后点击“选择文件”,选中你的 .certSigningRequest 文件,再次点击“继续”,然后点击“下载”。Apple 会返回一个扩展名为.cer的证书文件。双击该文件即可安装它,随后它会出现在钥匙串访问的“我的证书”下,与步骤 4 中创建的私钥配对。
使用证书进行签名只是 macOS 检查项的一半。Gatekeeper 要求从 Mac App Store 之外下载的软件既要使用 Developer ID 证书签名,又要经过 Apple 的公证(notarization),因此在分发之前,请先提交已签名的构建版本进行公证。公证并不能替代签名,而是在签名的基础上进行的额外检查。
查找私钥并进行备份
如果没有证书助理生成的私钥,证书就毫无用处,而这个密钥在你复制它之前只存在于一个地方。要查找它,请打开钥匙串访问,选择“登录”钥匙串,然后选择“密钥”类别,查找你在步骤 2 中输入的通用名称。你会在该名称下看到两个条目:一个公钥和一个私钥。请注意,公钥并不是你的 CSR:CSR 是你保存到磁盘上的那个 .certSigningRequest 文件。

一旦 .cer 文件安装完成,请改为查看“我的证书”。在那里,证书及其私钥会显示为一个单独的条目,这就是 codesign、Xcode 以及你的构建脚本所使用的签名身份。要将该身份转移到另一台 Mac 或构建服务器上,可以右键点击该条目并选择“导出”,这样会生成一个受密码保护的.p12文件,密码由你自行设置。请像保管任何签名密钥一样妥善保管该文件,因为任何拥有该文件及其密码的人都可以以你的名义为软件签名。
请在需要之前提前备份。Developer ID 证书的有效期为五年,且不能续订:当证书到期时,你需要创建一个替代证书。如果你丢失了私钥,该证书将永远无法再使用,你必须创建另一个证书,这会占用你五个 Developer ID Application 或五个 Developer ID Installer 名额中的一个。请不要为了“整理”而冲动地去吊销那个已失效的证书。Apple 明确指出,使用已吊销的 Developer ID 证书签名的应用将无法安装,也无法在已经安装该应用的用户设备上启动,因此吊销该证书会导致所有已经分发出去的副本全部无法使用。只有在密钥确实被盗的情况下才应吊销证书,并且要提前预料到这种破坏性后果。
对于那些是因为要申请商业证书而来到这篇文章的读者,还有一点需要注意:如果你已经在钥匙串访问中为公共证书颁发机构的订单生成了密钥对,那么该密钥对是无法使用的,任何 CA 都不会接受它。即使把它留在原处也不会造成任何问题,但也没有必要让可导出的签名密钥材料一直存放在钥匙串中。选中“密钥”下的公钥和私钥并将它们删除,然后改为通过令牌或 HSM 来下单申请。
常见问题
对于 Apple Developer ID 证书来说,可以,而且这正是 Apple 官方文档所记录的方法。但对于来自商业证书颁发机构的公开信任代码签名证书来说,不可以。自 2023 年 6 月 1 日起,这类私钥必须在符合 FIPS 140-2 Level 2、Common Criteria EAL4+ 或同等标准的硬件加密模块中生成并存储,而钥匙串访问创建的密钥是可导出的软件密钥材料。
位于/System/Library/CoreServices/Applications/中。Apple 在 macOS Sequoia 中将其移动到了这里,因此它不再位于“应用程序” > “实用工具”中,在“访达”中浏览“应用程序”时也不会显示出来。可以通过聚焦搜索打开它,或者在终端中运行 open "/System/Library/CoreServices/Applications/Keychain Access.app"。与之一同推出的独立“密码”应用只处理密码,不涉及证书和密钥。
对于 Developer ID 证书来说,RSA 2048 位是默认设置,因此你可以不勾选“让我指定密钥对信息”。选择 RSA 时,密钥大小菜单提供 2048、4096 和 8192 位,切换到 ECC 后则会替换为 256、384 和 521 位。无论哪种设置,都不会提供 3072 位这个选项,而这正是 CA/Browser Forum 对商业代码签名证书规定的最小值,这也是这条路径不适用于商业订单的原因之一。
因为它生成的请求只包含通用名称和电子邮件地址。Apple 不需要更多信息:它会根据你的开发者账户来填写 Developer ID 证书的主题信息。而商业证书颁发机构确实需要组织相关的详细信息,并会根据公开记录对其进行核实,这也是钥匙串请求不适合用于该类订单的另一个原因。
不需要。CA/Browser Forum 的硬件规则适用于由商业证书颁发机构颁发的公开信任代码签名证书。Developer ID 证书是由 Apple 自有的证书颁发机构颁发给 Apple Developer Program 成员的,密钥由证书助理在你的登录钥匙串中生成,正如上文所述。
需要为每一个分别生成一个。开发者门户要求每次创建证书时都上传一个证书签名请求,为每个身份提供各自独立的密钥对,意味着替换或吊销其中一个时,不会影响用另一个身份签名的软件。为每个请求设置一个便于日后在钥匙串访问中区分的通用名称。
请查看“登录”钥匙串中的“密钥”类别,按你输入的通用名称而不是文件名进行搜索。如果确实找不到,常见的原因包括:密钥对是在另一台 Mac 或另一个用户账户下创建的、钥匙串项目已被删除,或者该请求是通过菜单中“使用……从证书颁发机构请求证书”这种基于现有密钥的方式构建的。没有私钥,该请求就无法使用,因此需要重新生成一个新的。
根据 CA/Browser Forum 投票案 CSC-31,自 2026 年 3 月 1 日起颁发的公开信任代码签名证书的有效期上限为 460 天,从原本的 39 个月缩短而来。Apple Developer ID 证书的有效期为五年,且到期后是替换而非续订。在这两种情况下,只要签名时使用了时间戳,那么在证书有效期内签署的软件在证书过期后仍可正常使用。Apple 应用了一个例外情况:它会在安装包运行的那一刻检查 Developer ID Installer 证书,因此一旦该证书过期,.pkg文件就需要重新签名,尽管其中包含的应用本身不受影响。
相关阅读,请参见我们的代码签名教程、其他生成 CSR的方式,以及如何使用代码签名证书为 EXE 文件签名。

