bg-tutorials

如何在NGINX上生成CSR

本教程将向您展示如何在 NGINX 上生成 CSR。NGINX 本身不生成证书签名请求:您需要在将托管证书的同一台服务器上使用 OpenSSL 创建私钥和 CSR,然后将 CSR 提交给证书颁发机构。收到签发的证书后,通过 ssl_certificatessl_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 安装教程

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

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

龙飞行的详细图像
撰写人

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