本指南将向您展示如何在 Windows 上使用系统自带工具生成 CSR(证书签名请求)。
CSR 是一个 PKCS #10 文本块,它承载您的公钥和主体信息,提交给证书颁发机构进行签名并返回您的 SSL/TLS 证书。与之匹配的私钥则保留在生成该请求的机器上。
Windows 提供了三种原生方式来构建 CSR,下面将逐一介绍。请选择最适合您工作流程的方式:
- 证书 MMC 管理单元(图形界面),它会通过向导引导您完成操作,并允许您添加使用者备用名称。这是原始教程涉及的方法,也是大多数用户想要使用的方法。
- certreq.exe 命令行工具配合 INF 文件,该方式支持脚本化操作,支持 SAN,是 Windows Server 上的标准方法。
- 适用于 Windows 的 OpenSSL(需单独下载的二进制文件),它生成 CSR 的方式与 Linux 管理员的做法完全一致。
如果您运行的 Web 服务器有自己专属的 CSR 生成流程,请使用该流程,而不是本文的通用 Windows 步骤:请参阅 IIS 和 Microsoft Exchange 的专门指南。以下步骤适用于 Windows 10、Windows 11 以及 Windows Server 2016 至 2025;开始前请使用具有本地管理员权限的账户登录。
使用证书 MMC 管理单元生成 CSR
微软管理控制台(MMC)随每个受支持的 Windows 版本自带,并提供一个创建自定义请求向导,可以生成带有 SAN 条目的 CSR。该向导会将新生成的私钥存储在本地计算机证书存储区中,因此该机器上的任何 Windows 服务(IIS、ADFS、RD Gateway、RDP)在证书签发并安装后都可以使用它。
第 1 步:为本地计算机打开 MMC 证书管理单元
按下 Win + R,输入以下命令,然后按 Enter:
mmc
在空白的 MMC 控制台中,打开文件 > 添加/删除管理单元。在左侧列表中选择证书,点击添加,选择计算机账户,点击下一步,保持本地计算机选项不变,点击完成,然后点击确定。现在证书管理单元已锚定到本地计算机存储区,这正是 Windows 服务所读取的位置。
第 2 步:启动自定义证书请求
在左侧窗格中,展开证书(本地计算机),右键点击个人。选择所有任务 > 高级操作 > 创建自定义请求。证书注册向导将打开。点击下一步。
在选择证书注册策略界面,在自定义请求下选择不使用注册策略继续操作,然后点击下一步。这会告知 Windows 为外部 CA 构建独立的 CSR,而不是基于内部 Active Directory 证书服务模板进行注册。
第 3 步:选择模板和请求格式
在自定义请求界面,将模板设置为(无模板)CNG 密钥,保持请求格式为 PKCS #10,然后点击下一步。CNG(下一代加密)是现代 Windows 密钥提供程序,是新请求的正确选择;旧版 CSP 选项仅在需要兼容旧应用程序时才有必要使用。
在证书信息界面,展开请求条目旁边的详细信息箭头,点击属性。剩余的 CSR 配置就在证书属性对话框中完成。
第 4 步:填写主体信息和使用者备用名称
在常规标签页,输入一个友好名称和可选描述,便于日后在证书存储区中识别该待处理请求。
切换到使用者标签页。在使用者名称处,除非您非常清楚自己在做什么,否则不要将类型保持为完整可分辨名称;对于大多数订单,请使用类型下拉列表逐个添加各组成部分。对以下每个属性,选择类型、输入值,然后点击添加:
- 通用名称:您要保护的完全限定域名,例如 www.yourdomain.com。对于通配符证书,请在顶级域名前添加星号,例如 *.yourdomain.com。
- 国家:两位字母的 ISO 国家代码,例如 US、GB 或 DE。
- 省/州:完整的省或州名称(例如 California,而不是 CA)。
- 城市:您的组织注册所在地的完整城市名称(例如 San Jose,而不是 SJ)。
- 组织:您公司的法定名称,须与注册信息完全一致。OV 和 EV 证书要求填写此项。对于域名验证(DV)证书,此字段会被忽略,因此填写任意占位内容即可。
请跳过电子邮件属性。RFC 5280 规定,新证书若需包含电子邮件地址,应将其放在使用者备用名称扩展字段中(作为 rfc822Name),而不是放在主体可分辨名称中,公共 CA 可能会从 TLS 证书的主体中剥离电子邮件值。省略该项可以让 CSR 保持干净整洁。
在同一标签页的备用名称部分,将类型设置为 DNS,并添加证书必须覆盖的每一个主机名,每添加一条记录点击一次添加。此处也应始终列出通用名称:浏览器、.NET、Java、Go 以及其他现代 TLS 客户端会严格根据 SAN 列表验证主机名,而忽略通用名称。一个典型的网站证书通常使用两个 DNS 条目:
- yourdomain.com
- www.yourdomain.com
对于通配符订单,请同时添加通配符和顶级域名:*.yourdomain.com 和 yourdomain.com。
第 5 步:配置密钥和签名
切换到私钥标签页,依次展开每个部分。
- 加密服务提供程序:保持默认选中的 RSA, Microsoft Software Key Storage Provider。这是用于 RSA 密钥的现代 CNG 提供程序。
- 密钥选项:将密钥大小设置为 2048(目前公共 CA 的最低要求)。仅当您的策略要求更大的密钥时才选择 3072 或 4096;代价是 TLS 握手速度略微变慢。如果您希望有备份密钥或将已签发证书迁移到另一台服务器的选项,请勾选使私钥可以导出。
- 选择哈希算法:在选择哈希算法部分,选择 sha256。SHA-1 已不再被公共 CA 接受,SHA-256 是现代默认标准。请保持使用备用签名格式复选框处于未勾选状态。
点击确定关闭属性对话框,然后在向导中点击下一步。
第 6 步:保存 CSR 文件
在您想将离线请求保存到何处?界面,将文件格式设置为 Base 64(CA 期望的是 base64 编码的 PEM 格式,而不是二进制格式)。点击浏览,选择一个您日后能够找到的文件夹(专门的 C:certs 文件夹或桌面比默认的 Windows 路径更方便),为文件命名并加上 .req 或 .txt 扩展名,然后点击保存。点击完成以写入 CSR。
该向导会将 CSR 写入文件,并将匹配的私钥存储在证书(本地计算机) > 证书注册请求中。请不要删除该待处理请求:当 CA 返回已签发的证书时,Windows 会自动将其与等待中的密钥配对。
第 7 步:复制 CSR 并提交给 CA
用记事本打开保存的文件。您应该会看到类似下面这样的内容块:
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIDXjCCAkYCAQAwgZQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh
... (many lines of base64) ...
-----END NEW CERTIFICATE REQUEST-----
选中整个内容块,包括含五个连字符的 BEGIN NEW CERTIFICATE REQUEST 和 END NEW CERTIFICATE REQUEST 这两行,将其复制,然后粘贴到您的 SSL 订单表单中的 CSR 字段。
使用 certreq.exe 和 INF 文件生成 CSR
certreq.exe 命令行工具随每个版本的 Windows Server 自带,在 Windows 10 和 11 客户端上也同样存在。当您想要通过脚本创建 CSR、设置特殊的密钥参数,或是在无法运行 MMC 的会话中远程构建请求时,这是正确的方法。整个流程分为三个部分:编写请求 INF 文件、运行 certreq -new 生成 CSR,然后将 CSR 提交给您的 CA。
第 1 步:创建请求 INF 文件
以管理员身份打开记事本,将以下文件保存为 request.inf。请编辑 Subject 行和 [Extensions] 下的 DNS 条目,使其与您的域名匹配:
[Version]
Signature="$Windows NT$"
[NewRequest]
Subject = "CN=www.yourdomain.com, O=Your Company, L=San Jose, S=California, C=US"
KeySpec = 1
KeyLength = 2048
Exportable = TRUE
MachineKeySet = TRUE
SMIME = FALSE
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = 0xa0
HashAlgorithm = SHA256
[EnhancedKeyUsageExtension]
OID = 1.3.6.1.5.5.7.3.1
[Extensions]
2.5.29.17 = "{text}"
_continue_ = "dns=www.yourdomain.com&"
_continue_ = "dns=yourdomain.com"
关于各项值的说明:
- Subject:单行内容,各组成部分以逗号分隔。在 C= 中使用两位字母的 ISO 国家代码,省/州和城市名称请填写完整。
- KeyLength:最低为 2048。如果您的策略要求更大的密钥,请设置为 3072 或 4096。
- Exportable = TRUE:允许您将私钥与已签发的证书一起导出(用于备份或安装到第二台服务器)。如果您希望将密钥锁定在此机器上,请将其设置为 FALSE。
- MachineKeySet = TRUE:将密钥存储在本地计算机存储区中,这正是像 IIS 这样的服务所读取的位置。对于服务器工作负载,请保持该项开启。
- HashAlgorithm = SHA256:使用 SHA-256(现代默认标准)对请求进行签名。旧版示例有时默认使用 SHA-1,而公共 CA 已不再接受该算法。
- 2.5.29.17:使用者备用名称的 OID。每个主机名添加一行 _continue_;除最后一行外,每一行都必须以 & 分隔符结尾。此处也应列出您的通用名称,因为 TLS 客户端会根据 SAN 列表进行验证。
第 2 步:生成 CSR
打开提升权限的命令提示符或 PowerShell,切换到包含 request.inf 的文件夹,然后运行:
certreq -new request.inf request.csr
该工具会在本地计算机存储区中创建私钥,并将 PKCS #10 请求写入 request.csr。打开该文件,复制从 BEGIN NEW CERTIFICATE REQUEST 到 END NEW CERTIFICATE REQUEST 的完整内容块,粘贴到您的订单表单中。
当 CA 返回已签发的证书后,使用以下命令完成配对:
certreq -accept certnew.cer
该操作会将已签发的证书与存储区中一直等待的私钥绑定,之后任何需要该证书的 Windows 服务都可以使用它。
在 Windows 上使用 OpenSSL 生成 CSR
Windows 并不自带 OpenSSL,但可以从 Shining Light Productions 获取一个维护中的 Windows 版本。OpenSSL 的操作流程与 Linux 上完全相同,会将密钥和 CSR 生成为两个独立的文件,如果您计划将证书部署到不使用 Windows 证书存储区的平台(例如第三方反向代理、Tomcat 或自定义应用程序),这种方式会很有用。
安装 Win64 OpenSSL Light 包(常规安装程序对 CSR 相关工作已经足够),在安装过程中提示时,请将 OpenSSL 的 DLL 文件复制到 OpenSSL 的 bin 目录,而不是 Windows 系统文件夹。打开命令提示符或 PowerShell,确认 OpenSSL 已加入路径:
openssl version
如果找不到该命令,请将安装文件夹(通常为 C:Program FilesOpenSSL-Win64bin)添加到 PATH 中,或使用完整路径调用 openssl。然后用一条命令同时生成 CSR 和密钥:
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr -subj "/C=US/ST=California/L=San Jose/O=Your Company/CN=www.yourdomain.com" -addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
各参数的作用:
- -newkey rsa:2048 创建一个全新的 2048 位 RSA 密钥。如果您的策略要求更大的密钥,请使用 rsa:4096。
- -nodes 在写入私钥时不设置密码,以便使用该密钥的服务在启动时无需提示即可读取它。OpenSSL 3.x 将该标志重命名为 -noenc;-nodes 仍然可用,但已被视为已弃用。
- -keyout 和 -out 分别指定密钥文件和 CSR 文件的名称。
- -subj 以内联方式提供主体信息,这样 OpenSSL 就不会停下来进行交互式提问。
- -addext “subjectAltName=…” 添加 SAN 列表。此处也请包含通用名称。
OpenSSL 3.x 默认使用 SHA-256 对 CSR 进行签名,因此无需额外的摘要标志。请注意其头部有所不同:OpenSSL 写入的是 -----BEGIN CERTIFICATE REQUEST-----,而 MMC 向导和 certreq 写入的是 -----BEGIN NEW CERTIFICATE REQUEST-----。两者都是普通的 PKCS #10 请求,任何 CA 都会接受这两种形式。请将生成的 yourdomain.key 视为机密信息:任何持有该密钥的人都可以冒充该证书。
提交前验证 CSR
在将请求发送给您的 CA 之前,请确认通用名称、SAN 条目、密钥大小和签名算法。在 Windows 命令行中,certutil 可以读取任何 CSR 文件:
certutil -dump request.csr
如果您安装了 OpenSSL,等效的命令会打印出相同的详细信息:
openssl req -noout -text -in request.csr
更喜欢在浏览器中操作?将请求内容粘贴到 SSL Dragon 的CSR 解码器中,即可读取主体、SAN 列表、密钥大小和签名算法。请确认通用名称与客户端将使用的主机名一致,所需的每个名称都出现在 SAN 列表中,并且签名算法为 sha256WithRSAEncryption(或更强)。
如果您更希望在服务器之外生成 CSR,我们的CSR 生成器可以通过一个简单的表单构建请求(含 SAN)。不过需要权衡的是,私钥是在您的浏览器中生成的,而不是在 Windows 存储区中,因此当 CA 签发证书后,您需要将证书和密钥合并成一个 .pfx 文件,然后通过您应用程序的证书管理控制台导入它。
常见问题解答
如果您要保护的是一个从本地计算机证书存储区读取信息的 Windows 服务(IIS、ADFS、RDP、RD Gateway、WinRM),请使用 MMC 管理单元或 certreq.exe:两者都会将密钥生成在正确的位置,使已签发的证书能够顺利绑定使用。如果您正在为非 Windows 平台准备 CSR,或者希望获得一个可以复制到 Linux 服务器或第三方设备上的独立密钥文件,请在 Windows 上使用 OpenSSL。这三种方法生成的都是同一种 PKCS #10 格式的 CSR,所有公共 CA 都能接受。
不需要。RFC 5280 规定,新证书应将电子邮件地址作为 rfc822Name 放入使用者备用名称扩展字段中,而不是放在主体可分辨名称中。公共 CA 在签发过程中可能会从 TLS 证书的主体中剥离电子邮件值,因此添加它对 HTTPS 没有任何意义。请将电子邮件字段从向导或 INF 文件中省略。
使用 MMC 管理单元或 certreq.exe 时,密钥会作为待处理请求存放在证书(本地计算机) > 证书注册请求中,并在您完成注册后自动与已签发的证书配对。使用 OpenSSL 时,密钥则是写入在 CSR 旁边的 .key 文件;请像对待其他机密信息一样保护它,并在部署证书之前进行备份。
PowerShell 没有官方自带的 CSR cmdlet。New-SelfSignedCertificate 会创建一个密钥对,但它生成的是一个完整的自签名证书,而不是可供公共 CA 签名的 CSR。从 PowerShell 构建请求的受支持方法是编写上文所示的 INF 文件,然后对其调用 certreq.exe(即 certreq -new request.inf request.csr)。诸如 PSPKI 之类的第三方模块会对 certreq 进行封装,提供更友好的界面,但底层使用的工具仍然是 certreq。
该待处理请求及其私钥会保留在证书(本地计算机) > 证书注册请求中。它们本身不会产生任何作用,也不会造成任何问题,但会随着时间的推移不断累积。请打开 MMC 证书管理单元,检查待处理的请求,并删除您不再需要的项目;这样也会同时移除对应的密钥。

