本教程将向您展示如何在 NGINX 上生成 CSR。NGINX 本身不生成证书签名请求:您需要在将托管证书的同一台服务器上使用 OpenSSL 创建私钥和 CSR,然后将 CSR 提交给证书颁发机构。收到签发的证书后,通过 ssl_certificate 和 ssl_certificate_key 指令将 NGINX 指向该证书。
以下步骤适用于每个搭载 NGINX 的受支持 Linux 发行版(Debian、Ubuntu、RHEL、AlmaLinux、Rocky Linux、Amazon Linux),因为它们都自带 OpenSSL 1.1.1 或 3.x 版本。现代 OpenSSL 默认使用 SHA-256 对请求进行签名,因此您无需添加摘要标志。
步骤 1:连接到您的 NGINX 服务器
从您的本地计算机通过 SSH 连接到运行 NGINX 的服务器(macOS 或 Linux 上使用终端,Windows 上使用 PowerShell 或 Windows Terminal)。将用户名和主机替换为您自己的:
ssh your-user@your-nginx-server
在将提供证书服务的服务器上生成 CSR。私钥会与 CSR 一起创建,并且必须保留在该服务器上。在本地运行这些命令然后再将密钥复制过去,会失去拥有私钥的意义。
步骤 2:生成私钥和 CSR
运行以下命令。它一步生成 2048 位 RSA 私钥和相匹配的 CSR,主体和主题备用名称(SAN)以内联方式提供,这样 OpenSSL 就不会停下来询问问题:
openssl req -new -newkey rsa:2048 -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
每个部分的作用:
- -newkey rsa:2048 生成一个新的 2048 位 RSA 密钥。2048 位是目前公共 CA 接受的最低标准;您可以使用 rsa:4096 生成更大的密钥,或改用 ECDSA(见下文)。
- -nodes 使私钥保持未加密状态,以便 NGINX 在启动时可以读取它而无需输入密码短语提示。如果您希望加密密钥,请去掉 -nodes,并使用 NGINX 的 ssl_password_file 指令在启动和重载时提供密码短语。
- -keyout 和 -out 用于命名私钥文件和 CSR 文件。
- -subj 提供证书主体信息。此处请填写您真实的公司名称、州/省和城市,而不是占位符。CN(通用名称)是您的主域名。
- -addext “subjectAltName=…” 列出证书必须覆盖的每个主机名。公共 CA 会根据 SAN 列表进行验证,因此也应在此处包含通用名称。-addext 标志需要 OpenSSL 1.1.1 或更新版本;每个受支持的 Linux 版本至少都自带此版本。
请在整个过程中将 yourdomain.com 替换为您的实际域名。要覆盖其他主机名,请在 SAN 列表中用逗号分隔添加,例如 DNS:api.yourdomain.com。对于通配符,请同时包含通配符和裸域名:DNS:*.yourdomain.com,DNS:yourdomain.com。
如果您更倾向于使用 ECDSA 密钥(更小更快,且 P-256 得到广泛支持),请改用以下方式生成密钥和 CSR:
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
如果您的 OpenSSL 不支持 -addext
在使用 OpenSSL 1.1.1 之前旧版本的老旧系统上,-addext 标志不可用。请创建一个名为 san.cnf 的小型配置文件,内容如下:
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[ dn ]
C = US
ST = YourState
L = YourCity
O = YourCompany
CN = yourdomain.com
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = yourdomain.com
DNS.2 = www.yourdomain.com
然后运行:
openssl req -new -newkey rsa:2048 -nodes
-keyout yourdomain.key -out yourdomain.csr -config san.cnf
步骤 3:定位您的文件
列出当前目录以确认两个文件都已创建:
ls
您应该会看到两个新文件:
- yourdomain.key:您的私钥。请将其保存在服务器上,安全地备份它,并且切勿将其发送给任何人,包括证书颁发机构。持有该密钥的人可以冒充您的网站。
- yourdomain.csr:您的证书签名请求。这是您要提交给 SSL 提供商的文件。
立即为私钥设置严格的权限,使只有 root 才能读取它:
sudo chmod 600 yourdomain.key
sudo chown root:root yourdomain.key
步骤 4:验证 CSR(可选但建议执行)
在提交之前,请检查 CSR 是否包含正确的主体信息和 SAN,以及其签名是否有效。以下命令使用 OpenSSL 在本地解码该请求:
openssl req -noout -text -verify -in yourdomain.csr
确认 Subject 行显示您的详细信息,X509v3 Subject Alternative Name 列出了您期望的每个主机名,并且签名检查显示 verify OK。签名算法应显示为 sha256WithRSAEncryption(对于 ECDSA 密钥则为 ecdsa-with-SHA256)。如果您不想使用命令行,可以将 CSR 粘贴到我们的在线CSR 解码工具中,在浏览器中查看相同的字段信息。
步骤 5:提交您的 CSR
要复制订单所需的 CSR,请打印其内容:
cat yourdomain.csr
您将看到如下一段文本:
-----BEGIN CERTIFICATE REQUEST-----
MIIBozCB... (a long string of characters)
-----END CERTIFICATE REQUEST-----
请复制整个区块,包括 —–BEGIN CERTIFICATE REQUEST—– 和 —–END CERTIFICATE REQUEST—– 这两行(每个标记两侧各有五个连字符)。整个区块就是您的 CSR。在购买过程中将其粘贴到订单表单中,并将匹配的私钥保留在服务器上。
如果您不想使用命令行,也可以使用我们的在线CSR 生成工具来构建请求。请注意,它会在您的浏览器中生成私钥,因此您需要自行保存该密钥并将其移动到服务器上。
CA 签发证书后会发生什么
一旦 CA 验证了 CSR 并签发了证书,您通常会收到您的服务器证书(一个以您的域名命名的 .crt 文件)以及一个或多个中间证书,有时会打包成一个 .ca-bundle 文件。NGINX 期望将服务器证书和中间证书链合并为一个文件(即”fullchain”),并通过 ssl_certificate 指向该文件;您上面生成的私钥则通过 ssl_certificate_key 单独指向。完整的操作流程(构建 fullchain、编辑服务器配置块、测试和重载)请参阅我们的NGINX SSL 安装教程。


