
在从 RapidSSL、GeoTrust 或 DigiCert 等证书颁发机构 (CA) 获得 SSL 证书之前,您需要生成证书签署请求 (CSR)。本指南将引导您完成 Linux 和 Windows 上的整个过程,解释您需要填写的每个字段。
什么是 CSR?
CSR(证书签署请求)是一个文本文件,包含有关您的组织和域的信息,以及与同时生成的私钥相关联的公钥。当您将 CSR 提交给 CA 时,他们使用其中的信息为您的域创建已签署的 SSL 证书。
CSR 工作流如下:
- 您在服务器上生成私钥和 CSR
- 您将 CSR(而不是私钥)提交给 CA
- CA 验证信息并颁发您的证书
- 您在服务器上安装证书和私钥
重要:您的私钥必须仅保留在您的服务器上。永远不要将其发送给 CA 或任何第三方。如果您的私钥被破坏,您必须立即撤销证书并请求新证书。
CSR 中的内容(CN、O、OU、SAN)
当您解码 CSR 时,您会发现它包含两个主要部分:主题(有关域或组织的身份信息)和 CA 将签署的公钥。主题由多个标准字段组成,每个字段发挥不同的作用,影响您收到的证书类型。了解每个字段的含义有助于您第一次正确填写数据,这样您就不必多次重新生成 CSR。
每个 CSR 中最重要的字段是:
- CN(通用名称) — 证书将保护的主域。这是最重要的字段,必须与您的实际域完全匹配,例如
shop.example.com - O(组织) — 您注册的公司名称。OV/EV SSL 需要,因为 CA 针对法律商业文件进行验证。对于 DV SSL,此字段通常不在证书中显示
- OU(组织单位) — 组织内的部门,例如
IT或Web Operations。这是可选的,大多数 CA 现在正在逐步淘汰此字段 - L / ST / C — 地点(城市)、州/省和两字母国家代码,例如
Bangkok / Bangkok / TH - SAN(主题备用名称) — 同一证书将涵盖的其他域的列表,例如
example.com和www.example.com。现代浏览器依靠 SAN 作为事实来源,而不仅仅是 CN
关键提示:现代浏览器(Chrome、Firefox、Safari)使用 SAN 值来验证域是否与证书匹配 — 他们不再仅依赖 CN。因此,如果您希望 example.com 和 www.example.com 都使用相同的证书,您必须始终在 SAN 中包含两个名称。
生成 CSR 前所需的信息
生成 CSR 前准备以下信息:
- Common Name (CN) — 您要申请 SSL 的域名,例如
yourdomain.com或www.yourdomain.com - Organization (O) — 您注册的公司名称(OV/EV SSL 必填,CA 将验证法律文件)
- Organizational Unit (OU) — 部门名称,例如 IT Department
- City/Locality (L) — 您的城市,例如 Bangkok
- State/Province (ST) — 您的省份/州,例如 Bangkok
- Country (C) — 两字母国家代码,例如 TH
- Email Address — 管理员电子邮件
使用 OpenSSL 在 Linux 上生成 CSR
OpenSSL 在大多数 Linux 系统上都预先安装。在您的终端中运行以下命令:
步骤 1:同时生成私钥和 CSR
openssl req -new -newkey rsa:2048 -nodes \
-keyout yourdomain.key \
-out yourdomain.csr
此命令会提示您填写每个字段并创建两个文件:
yourdomain.key— 您的私钥(保留在服务器上,切勿共享)yourdomain.csr— 提交给 CA 的 CSR 文件
步骤 2:非交互式(单行命令)
openssl req -new -newkey rsa:2048 -nodes \
-keyout yourdomain.key \
-out yourdomain.csr \
-subj "/C=TH/ST=Bangkok/L=Bangkok/O=Your Company/OU=IT/CN=yourdomain.com"
步骤 3:验证 CSR 内容
openssl req -text -noout -verify -in yourdomain.csr
This command displays all the information in your CSR so you can verify it before submitting to the CA.
在 Windows 上生成 CSR
在 Windows 上,您可以通过 IIS Manager 或为 Windows 安装 OpenSSL 来生成 CSR。
方法 1:使用 IIS Manager
- 打开 IIS 管理器,点击您的服务器
- 双击"服务器证书",然后点击"创建证书请求"
- 填写可分辨名称属性
- 选择 Microsoft RSA SChannel 作为加密服务提供程序,并将位长度设置为 2048
- 保存生成的 .txt 文件——这就是您的 CSR
方法 2:Windows 上的 OpenSSL
从 slproweb.com 下载 Windows OpenSSL,然后在 Command Prompt 或 PowerShell 中运行与 Linux 相同的命令。
通过 DirectAdmin 生成 CSR(不需要命令)
如果您使用 DirectAdmin 的托管或 VPS(例如 AsiaGB 软件包),您可以直接从网络界面生成 CSR 和私钥,而无需打开终端。DirectAdmin 自动在服务器上存储私钥,降低了复制文件时密钥泄露的风险。请按照以下步骤操作:
- Log in to DirectAdmin and go to the SSL Certificates menu under the target domain
- Choose the Create A Certificate Request option
- Fill in all CSR fields: Common Name (domain), Email, Organization, City, State, Country, and Key Size (choose 2048 or higher)
- If supported, add SAN entries in the More Certificate Names box to cover both
example.comandwww.example.com - Click Save — DirectAdmin generates and stores the Private Key, then displays the CSR (the
-----BEGIN CERTIFICATE REQUEST-----block) for you to copy
复制整个 CSR 块并将其粘贴到您的 SSL 订单表中。CA 颁发您的证书后,您可以直接将其粘贴到 DirectAdmin 的 Paste a pre-generated certificate and key 菜单中,因为匹配的私钥已经存储。有关完整的安装步骤,请参阅 在 DirectAdmin 上安装 SSL 证书。
注意:在 DirectAdmin 托管上的 AsiaGB 客户可以从控制面板免费生成 CSR,或在自己的机器上使用 OpenSSL 并提交 CSR。两种方法都适用于付费 SSL 证书(DV 从 1,000 THB/年起)。
正确填写 CSR(CN 匹配、通配符 *.domain.com)
CA 拒绝 CSR 或为错误域颁发证书的最常见原因是通用名称与您实际想要使用的域不匹配。因此,为您的证书类型选择正确的 CN 格式至关重要。下表总结了如何为每种情况填写 CN:
| 您想要保护的内容 | 输入 CN 为 | 证书类型 |
|---|---|---|
| 仅主域 | example.com |
单域 |
| 域 + www | example.com + SAN www.example.com |
单一 + SAN |
| 所有第一级子域 | *.example.com |
通配符 |
| 多个不同的域 | example.com + SAN example.net, example.org |
多域 (SAN) |
关于通配符证书的一个常见误解是,*.example.com 仅涵盖一级子域名,例如 blog.example.com 或 shop.example.com。它不涵盖裸域名 example.com,也不涵盖嵌套子域名如 a.b.example.com。如果您还希望裸域名也能正常使用,必须在 CSR 的 SAN 中添加 example.com。
Generating a Wildcard + SAN CSR with OpenSSL
OpenSSL doesn't accept SAN entries directly through -subj; you need a config file first, such as san.cnf:
[ req ]
default_bits = 2048
distinguished_name = dn
req_extensions = req_ext
prompt = no
[ dn ]
C = TH
ST = Bangkok
L = Bangkok
O = Your Company
CN = *.example.com
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = example.com
DNS.2 = *.example.com
Then generate the CSR referencing this config file:
openssl req -new -newkey rsa:2048 -nodes \
-keyout example.key \
-out example.csr \
-config san.cnf
验证 CSR 并保持私钥安全
在将 CSR 提交给 CA 之前,请始终检查其内容,以确认 CN、组织和 SAN 值都是正确的。一个小错误 — 例如 CN 中的单个打字错误 — 可能会强制您重新颁发整个证书。使用此命令以可读格式查看 CSR 内容:
openssl req -noout -text -in example.csr
查看 Subject: 行以检查 CN/O/C,并查找 X509v3 Subject Alternative Name: 以确认您想要的所有 SAN 条目都存在。要验证 CSR 和私钥是否是匹配的对,请比较两个文件的模数:
openssl req -noout -modulus -in example.csr | openssl md5
openssl rsa -noout -modulus -in example.key | openssl md5
The two md5 outputs must be identical. If they differ, the CSR and Private Key are not a matching pair, and the server will refuse to start HTTPS once installed.
保持私钥安全
- 使用
chmod 600 example.key尽可能严格地限制文件权限,以便只有所有者可以读取 - 仅在服务器上保留私钥 — 不要通过电子邮件或聊天发送,也不要将其提交到 Git 存储库
- 在安全位置备份私钥(密码管理器或秘密保管库),因为丢失它意味着您无法安装收到的证书
- 如果您怀疑私钥已泄露,请立即撤销证书并生成新的 CSR 和密钥
读取和提交您的 CSR
您的 CSR 文件是 Base64 编码的,如下所示:
-----BEGIN CERTIFICATE REQUEST-----
MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCVEgxEDAOBgNVBAgMB0Jhbmdrb2sxEDAO
...
-----END CERTIFICATE REQUEST-----
复制整个文本,包括 -----BEGIN CERTIFICATE REQUEST----- 和 -----END CERTIFICATE REQUEST----- 行,然后在从 AsiaGB 购买时将其粘贴到 SSL 订单表中。
要避免的常见 CSR 错误
- 通用名称不匹配 — 确保 CN 与您想要保护的域完全匹配(带或不带 www)
- 字段中的特殊字符 — 避免在组织字段中使用 &、@、!、#;仅使用字母数字字符
- 私钥和 CSR 不匹配 — 如果单独生成,请使用匹配的对
- 密钥长度不足 — 使用 RSA 2048 位或更高,或 ECDSA 256 位
关于 CSR 的常见问题
每次创建 CSR 时是否需要生成新的私钥?
通常建议每次创建新的 CSR 时同时生成新的私钥,因为这样更安全。但从技术上讲,您也可以使用 openssl req -new -key example.key -out new.csr 从现有私钥创建新的 CSR,这在续期证书时保留相同密钥的情况下非常有用。话虽如此,每次生成新密钥可以降低旧密钥泄露带来的风险。
CSR 会过期吗?
CSR 文件本身不会过期——您可以随时将其存储并提交给 CA。但在实践中,每次申请证书时都应生成新的 CSR,因为您的组织信息或 CA 的策略(如最低密钥长度要求)可能已发生变化。真正有过期日期的是从 CSR 颁发的证书,其有效期取决于证书的有效时长。
我可以重用旧 CSR 来续期 SSL 吗?
可以,但不推荐。使用旧 CSR 续期意味着继续使用相同的私钥。如果该密钥已使用较长时间或存在泄露风险,建议生成新的 CSR 和私钥。大多数 CA 系统支持两种方式——只需在续期步骤中粘贴 CSR 即可。
RSA 2048 和 ECDSA 有什么区别?应该选哪个?
RSA 2048 位是兼容性最广的标准,与所有旧版服务器兼容。ECDSA(如 P-256)提供同等安全性,但密钥更小,握手速度略快。除非有特殊需求,RSA 2048 对于典型网站已足够安全。