bg-tutorials

如何在 Windows 中生成 CSR

本指南将向您展示如何在 Windows 上使用系统自带工具生成 CSR(证书签名请求)

CSR 是一个 PKCS #10 文本块,它承载您的公钥和主体信息,提交给证书颁发机构进行签名并返回您的 SSL/TLS 证书。与之匹配的私钥则保留在生成该请求的机器上。

Windows 提供了三种原生方式来构建 CSR,下面将逐一介绍。请选择最适合您工作流程的方式:

  • 证书 MMC 管理单元(图形界面),它会通过向导引导您完成操作,并允许您添加使用者备用名称。这是原始教程涉及的方法,也是大多数用户想要使用的方法。
  • certreq.exe 命令行工具配合 INF 文件,该方式支持脚本化操作,支持 SAN,是 Windows Server 上的标准方法。
  • 适用于 Windows 的 OpenSSL(需单独下载的二进制文件),它生成 CSR 的方式与 Linux 管理员的做法完全一致。

如果您运行的 Web 服务器有自己专属的 CSR 生成流程,请使用该流程,而不是本文的通用 Windows 步骤:请参阅 IISMicrosoft 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 国家代码,例如 USGBDE
  • 省/州:完整的省或州名称(例如 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.comyourdomain.com

第 5 步:配置密钥和签名

切换到私钥标签页,依次展开每个部分。

  • 加密服务提供程序:保持默认选中的 RSA, Microsoft Software Key Storage Provider。这是用于 RSA 密钥的现代 CNG 提供程序。
  • 密钥选项:密钥大小设置为 2048(目前公共 CA 的最低要求)。仅当您的策略要求更大的密钥时才选择 30724096;代价是 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 REQUESTEND 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。如果您的策略要求更大的密钥,请设置为 30724096
  • 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 REQUESTEND 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 CSR 生成方法?

如果您要保护的是一个从本地计算机证书存储区读取信息的 Windows 服务(IIS、ADFS、RDP、RD Gateway、WinRM),请使用 MMC 管理单元或 certreq.exe:两者都会将密钥生成在正确的位置,使已签发的证书能够顺利绑定使用。如果您正在为非 Windows 平台准备 CSR,或者希望获得一个可以复制到 Linux 服务器或第三方设备上的独立密钥文件,请在 Windows 上使用 OpenSSL。这三种方法生成的都是同一种 PKCS #10 格式的 CSR,所有公共 CA 都能接受。

我应该在 CSR 主体中包含我的电子邮件地址吗?

不需要。RFC 5280 规定,新证书应将电子邮件地址作为 rfc822Name 放入使用者备用名称扩展字段中,而不是放在主体可分辨名称中。公共 CA 在签发过程中可能会从 TLS 证书的主体中剥离电子邮件值,因此添加它对 HTTPS 没有任何意义。请将电子邮件字段从向导或 INF 文件中省略。

在 Windows 上创建 CSR 之后,私钥存放在哪里?

使用 MMC 管理单元或 certreq.exe 时,密钥会作为待处理请求存放在证书(本地计算机) > 证书注册请求中,并在您完成注册后自动与已签发的证书配对。使用 OpenSSL 时,密钥则是写入在 CSR 旁边的 .key 文件;请像对待其他机密信息一样保护它,并在部署证书之前进行备份。

我可以直接用 PowerShell 生成 CSR,而不用 INF 文件吗?

PowerShell 没有官方自带的 CSR cmdlet。New-SelfSignedCertificate 会创建一个密钥对,但它生成的是一个完整的自签名证书,而不是可供公共 CA 签名的 CSR。从 PowerShell 构建请求的受支持方法是编写上文所示的 INF 文件,然后对其调用 certreq.exe(即 certreq -new request.inf request.csr)。诸如 PSPKI 之类的第三方模块会对 certreq 进行封装,提供更友好的界面,但底层使用的工具仍然是 certreq。

如果我取消了向导或从未提交该请求,会发生什么?

该待处理请求及其私钥会保留在证书(本地计算机) > 证书注册请求中。它们本身不会产生任何作用,也不会造成任何问题,但会随着时间的推移不断累积。请打开 MMC 证书管理单元,检查待处理的请求,并删除您不再需要的项目;这样也会同时移除对应的密钥。

立即订购 SSL 证书, 可节省 10% 的费用!

快速发行, 强大加密, 99.99% 的浏览器信任度, 专业支持和 25 天退款保证. 优惠券代码 SAVE10

龙飞行的详细图像
撰写人

经验丰富的内容撰稿人, 擅长 SSL 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.