代码签名证书用于证明软件的发布者身份,并证明代码自签名以来未被更改。要申请一个代码签名证书,您需要创建一个 CSR(证书签名请求),这是证书颁发机构(CA)用来识别您身份并颁发证书的编码文本块。代码签名证书的 CSR 与您为网站创建的 CSR 遵循不同的规则,而且这些规则在 2023 年发生了变化。本指南将解释当前的流程以及仍然适用的方法。
私钥必须存储在硬件设备上
自2023 年 6 月 1 日起,CA/浏览器论坛的代码签名基线要求规定,所有公开信任的代码签名证书的私钥都必须在符合FIPS 140-2 二级、通用标准 EAL4+或同等标准的硬件上生成和存储。这一要求适用于标准证书(组织验证和个人验证)以及扩展验证(EV)证书。在此日期之前,EV 代码签名证书就已经要求使用硬件;2023 年的变化则将同样的规则扩展到了标准证书。
这一变化带来的实际后果非常重要:完全通过软件、浏览器,或存储在笔记本电脑或服务器上的普通文件中生成的私钥和 CSR,将不再被接受用于申请公开信任的代码签名证书。CA 已停止支持基于浏览器的密钥生成以及以 .pfx 文件形式下载的方式来发放此类产品。密钥必须在符合标准的设备上生成,并始终保留在该设备上。这就留下了两种有效途径:
- 使用 CA 预先配置好的硬件令牌。CA 会直接在经认证的 USB 令牌上生成密钥对和 CSR,将颁发的证书安装到令牌中,然后将令牌邮寄给您。签名时只需插入该令牌即可。使用此方法时,您自己不需要生成 CSR。
- 使用您自己的 HSM 或云 HSM,并提供密钥认证证明。如果您已经拥有符合标准的硬件安全模块(或云 HSM,例如 AWS CloudHSM、Azure Dedicated HSM 或 Google Cloud HSM),您可以在该设备上生成密钥和 CSR,并提供一份认证文件,向 CA 证明该密钥是在符合标准的硬件上创建的,且无法从该硬件中导出。
您选择哪种途径是在下单时确定的。若需并列比较这两种方式,请参阅代码签名证书交付方式。
选项一:令牌加邮寄(由 CA 创建 CSR)
这是大多数个人和小团队选择的途径,因为它不需要您自备任何硬件。当您在下单时选择令牌加邮寄方式时,CA 会在其一端的经认证令牌上完成密钥生成和 CSR 创建,然后将已预装证书的令牌邮寄给您。您不需要将 CSR 粘贴到订单表单中。
您需要做的是:
- 完成 CA 要求的验证步骤(组织验证或身份验证)。
- 等待实体令牌寄达。
- 安装令牌驱动程序(通常是 SafeNet Authentication Client),并在连接令牌的状态下对软件进行签名。
选项二:在您自己的 HSM 或令牌上生成 CSR
如果您已经拥有符合标准的硬件,可以在该设备上生成密钥对和 CSR,并提供相应的认证证明。具体步骤取决于所使用的硬件,因此请参考适用于您设备的指南,或您供应商自己的文档:
对于云 HSM(AWS CloudHSM、Azure Dedicated HSM、Google Cloud HSM),请在 HSM 内部生成密钥,导出该平台生成的 CSR 和认证文件,然后在下单时将两者一并提交给您的 CA。
以下是所有基于硬件的 CSR 都适用的几个要点:
- 按照基线要求的规定,使用至少 3072 位的 RSA 密钥,或同等强度的 ECDSA 密钥。
- 将密钥标记为不可导出,以确保它无法离开该设备。
- 在生成密钥的同时生成认证证明。没有有效认证证明的 CSR 将被拒绝。
OpenSSL、Java Keytool、MMC、CertReq 和 Keychain 方法现在的适用场景
您可能见过一些较旧的教程,介绍如何使用 OpenSSL、Java 的 keytool 工具、Microsoft 管理控制台(MMC)、Windows 的 certreq 命令,或 macOS 上的 Keychain Access 来创建代码签名 CSR。这些工具单独使用时,会在软件中生成密钥,因此以这种方式生成的 CSR 如今已不再适用于申请公开信任的代码签名证书。
但当这些工具指向符合标准的硬件而非软件密钥库时,它们仍然有其用途。例如,OpenSSL 可以通过 PKCS#11 模块针对 HSM 生成 CSR,CertReq 或 MMC 也可以构建使用硬件密钥存储提供程序的请求。请仅在此类场景下参考以下资源,并始终将请求与设备提供的认证证明配对使用:
- 使用 OpenSSL 生成代码签名 CSR
- 使用 Java Keystore 生成代码签名 CSR
- 使用 CertReq 生成代码签名 CSR
- 使用 Microsoft 管理控制台生成代码签名 CSR
- 使用 macOS Keychain Access 生成代码签名 CSR
检查 CSR 的内容
在提交 CSR 之前,请确认主体信息是否正确。如果您已安装 OpenSSL,可以在本地解码该请求并以纯文本形式查看:
openssl req -noout -text -in codesigning.csr
请检查输出结果中的组织名称或通用名称以及密钥大小。此处不适合使用标准的网站 CSR 检查工具,因为代码签名 CSR 是与硬件绑定的,需要通过认证证明来验证,而不是通过公开的 HTTPS 扫描来验证。
常见问题
要视情况而定。如果您下单选择令牌加邮寄方式,CA 会在令牌上为您生成密钥和 CSR,因此您自己不需要创建 CSR。如果您使用自己的 HSM 或云 HSM,则需要在该硬件上生成 CSR,并连同认证文件一起提交。无论采用哪种方式,密钥都必须在符合标准的硬件上创建。
自 2023 年 6 月 1 日起,CA/浏览器论坛的代码签名基线要求已强制规定必须使用硬件保护的密钥。私钥必须在符合 FIPS 140-2 二级、通用标准 EAL4+ 或同等标准的设备上生成和存储。通过软件创建的密钥无法达到这一标准,因此 CA 不会针对仅基于软件生成的 CSR 颁发公开信任的证书。
认证证明是由硬件签署的一种证据,用于证明私钥是在符合标准的设备上生成的,且无法从该设备中导出。当您在自己的 HSM、云 HSM 或令牌上生成 CSR 时,就需要提供认证证明。CA 会在颁发证书之前检查该认证证明。如果使用的是 CA 邮寄的预配置令牌,认证证明则由 CA 一方处理。
应使用至少 3072 位的 RSA 密钥,或同等强度的 ECDSA 密钥。这是基线要求为代码签名设定的最低标准。
硬件规则是相同的。EV 代码签名证书一直都要求使用硬件保护的密钥,而自 2023 年 6 月 1 日起,标准代码签名证书也遵循同样的要求。标准证书与 EV 证书的主要区别在于验证级别和证书所承载的信任信号,而不是密钥的存储方式。
只有当它们指向符合标准的硬件时才可以。OpenSSL 可以通过 PKCS#11 模块针对 HSM 生成 CSR,而 keytool、MMC 或 CertReq 也可以构建由硬件密钥存储支持的请求。如果这些工具是从普通的软件密钥库中创建 CSR,则不会被接受用于申请公开信任的代码签名证书。

