本指南解释了在使用 OpenSSL 时如何为代码签名证书生成证书签名请求(CSR),同样重要的是,何时这种方法不再适用。自2023年6月1日起,代码签名密钥的规则发生了变化,因此传统的纯软件 OpenSSL 工作流程已不再被证书颁发机构接受,用于签发受公众信任的代码签名证书。请先阅读下面的要求,然后根据你的密钥存储方式选择相应的路径。
重要提示:代码签名密钥必须存放在硬件中
根据CA/浏览器论坛代码签名基线要求,自2023年6月1日起生效,所有受公众信任的代码签名证书(包括标准(OV)和扩展验证(EV)证书)的私钥,都必须在符合FIPS 140-2 Level 2、Common Criteria EAL4+或同等标准的硬件加密模块中生成和存储。该密钥必须不可导出。EV 代码签名一直要求使用硬件;此规则将同样的保护措施扩展到了标准证书。
实际后果是:仅通过纯软件在笔记本电脑或服务器上使用普通 OpenSSL 生成的私钥和 CSR,已不再被接受用于签发受公众信任的代码签名证书。证书颁发机构已停止支持针对这些产品使用基于浏览器的密钥生成方式和软件 CSR。你的密钥现在必须存放在以下位置之一:
- 寄送给你的硬件令牌(例如 YubiKey 或 SafeNet/Thales eToken)。采用令牌+邮寄的交付方式时,证书颁发机构会在设备上生成密钥并处理 CSR,因此你无需使用 OpenSSL 自行创建。
- 你自己控制的硬件安全模块(HSM),可以是本地部署或云端。在这种情况下,你需要在 HSM 内部生成密钥,并生成 CSR 以及能够证明该密钥是在硬件中创建的密钥认证证明。
- 云签名服务,由服务商代表你将密钥保存在符合标准的 HSM 中。
请根据你计划接收和存储证书的方式选择相应的路径。有关概述,请参阅代码签名交付方式指南。有关基于硬件的 CSR 和认证步骤,请按照与你的设备相匹配的指南操作:
如果你使用其他厂商的 HSM,请使用该厂商提供的工具生成 CSR,以确保密钥保留在硬件中。稍后展示的 OpenSSL req 命令,在 OpenSSL 通过 provider 或 engine 驱动 HSM 的工作流程中仍然有其作用,但它必须引用一个已经存在于模块中的密钥,而对于受公众信任的证书,绝不能引用普通的软件密钥文件。
软件版 OpenSSL 方法仍然适用的情况
下面的软件工作流程会在磁盘上生成一个密钥文件。这仅在不属于受公众信任的代码签名证书的情况下才可接受,例如:
- 使用私有/企业 CA 进行内部或测试签名,此时密钥存储由你自己的策略而非公共 CA/浏览器论坛规则决定。
- 在转向使用令牌或 HSM 之前,先学习 OpenSSL 的命令结构。
- 提前准备好主题信息和命令语法,以便在针对你的硬件密钥生成真正的 CSR 时重复使用。
不要将软件生成的密钥和 CSR 提交给公共证书颁发机构以申请 OV 或 EV 代码签名证书,它会被拒绝。明确了这一界限后,下面是 OpenSSL 的具体流程和相关命令。
1. 下载并安装 OpenSSL
如果你的计算机上还没有安装 OpenSSL,请为你的操作系统下载一个当前版本(OpenSSL 3.x 或更高版本)并进行安装。macOS 和大多数 Linux 发行版已经自带 OpenSSL;在 Windows 上,通常需要安装第三方构建版本。使用以下命令确认安装情况和版本号:
openssl version
2. 打开终端并加载 OpenSSL
在 Windows 上,按下Windows 键 + R,输入cmd,然后按Enter。对于需要将文件写入受保护文件夹的命令,请以管理员身份运行命令提示符:右键点击命令提示符图标,然后选择以管理员身份运行。你也可以在任务栏搜索框中输入cmd,然后从那里打开命令提示符。在 macOS 或 Linux 上,打开你的终端应用程序。
如果在 Windows 上 OpenSSL 二进制文件不在系统路径中,请先切换到其安装文件夹,使用与你的构建版本相匹配的路径:
cd OpenSSL-Win32bin
cd "Program FilesOpenSSL-Win64bin"
3. 生成私钥和 CSR
首先生成私钥。代码签名证书需要强密钥:使用 RSA 3072位(或更长),这是代码签名的常见最低要求,或使用 P-256 曲线上的 ECDSA 密钥。要创建 RSA 3072位密钥:
openssl genrsa -out code_signing_key.key 3072
然后从该密钥生成 CSR。在当前版本中,OpenSSL 默认使用 SHA-256 对请求进行签名:
openssl req -new -key code_signing_key.key -out code_signing_csr.txt
4. 填写 CSR 字段
OpenSSL 会提示你输入用于标识证书持有者的详细信息。请输入准确、最新的信息,并与你的合法组织记录相匹配,因为 CA 会对其进行验证。请将示例替换为你自己的详细信息:
- 国家(C):你公司注册所在地或你居住地的两字母国家代码,例如US。
- 州或省(ST):完整的州或省名称,例如California。
- 地区(L):你公司注册所在的城市,例如San Jose。
- 组织名称(O):你组织的正式合法名称,如果证书是为个人申请,则填写你的完整法定姓名,例如GPI Holding LLC。
- 组织单位(OU):申请证书的部门,例如IT。此字段为可选项。
- 通用名称(CN):你组织的法定名称,或个人证书的完整姓名。对于代码签名,通用名称就是作为发布者显示的身份信息。
- 电子邮件地址:一个有效的联系电子邮件地址。
你可以将可选的挑战密码和可选的公司名称字段留空:在这些提示处直接按Enter即可。
你也可以将第3步和第4步合并为一条命令。-subj标志可直接以内联方式提供主题信息,这样 OpenSSL 就不会再进行提示,而-nodes会使密钥以未加密形式保存在磁盘上(OpenSSL 3.x 将此标志重命名为-noenc,但-nodes仍然可用)。请注意,该值使用的是直引号,而不是弯引号,并且整个字符串用一对引号括起来:
openssl req -new -newkey rsa:3072 -nodes -keyout code_signing_key.key -out code_signing_csr.txt -subj "/C=US/ST=California/L=San Jose/O=GPI Holding LLC/OU=IT/CN=GPI Holding LLC"
5. 验证 CSR
在提交任何内容之前,请确认 CSR 有效且其详细信息正确无误。此命令会打印解码后的主题信息并检查请求签名:
openssl req -noout -text -verify -in code_signing_csr.txt
检查主题行(Subject)中列出的国家、组织和通用名称是否与你的意图完全一致,公钥长度是否为3072位或更长(或为 ECDSA 密钥),以及签名算法是否为 SHA-256。你还应该看到verify OK消息,这确认了该 CSR 是由与其匹配的私钥签名的。
6. 将私钥和 CSR 移动到安全目录
将私钥和 CSR 从 OpenSSL 文件夹移动到你自己控制的目录中。请务必保管好私钥,切勿与组织外的任何人分享:任何持有该私钥的人都可以以你的名义签署软件。在 Windows 上,创建一个文件夹并将文件移动到其中:
md c:codesigningcertificates
move code_signing_key.key c:codesigningcertificates
move code_signing_csr.txt c:codesigningcertificates
7. 将 CSR 提交给你的 CA
使用任意纯文本编辑器(例如记事本)打开 CSR 文件,并复制其全部内容,包括—–BEGIN CERTIFICATE REQUEST—–和—–END CERTIFICATE REQUEST—–这两行,粘贴到你订购证书时的注册表单中。CSR 内容块看起来类似这样:
-----BEGIN CERTIFICATE REQUEST-----
MIICvDCCAaQCAQAw...
...base64 encoded request...
-----END CERTIFICATE REQUEST-----
请记住本指南开头提到的规则:对于受公众信任的代码签名证书,你提交的 CSR 必须对应一个在符合标准的硬件中生成并保存的密钥。如果你使用上述步骤生成了软件密钥,请仅将其用于内部或测试签名。对于公共 CA 的正式订购,请使用YubiKey或Luna HSM指南,从你的令牌或 HSM 中生成 CSR,或者选择令牌+邮寄的交付方式,让 CA 代为生成密钥。
如需了解 CSR 创建之外更多通用的 OpenSSL 语法,OpenSSL 命令参考手册是一个很有用的辅助资料。你还可以进一步查阅更多OpenSSL 教程和代码签名教程,或阅读其他生成 CSR的方法。

