bg-tutorials

如何在 Apache 上生成 CSR

本教程展示如何在 Apache 上生成 CSR,方法是在运行 Apache HTTP Server 的同一台服务器上使用 OpenSSL 命令行。你将通过一条命令创建两个文件:一个新的私钥,以及与之匹配的 CSR(证书签名请求),你需要将其提交给你的证书颁发机构。

以下步骤适用于每一个托管 Apache 的现代 Linux 发行版(Ubuntu、Debian、RHEL、AlmaLinux、Rocky Linux、Amazon Linux 2023),因为它们都自带 OpenSSL 1.1.1 或 OpenSSL 3.x。这两个版本默认都使用 SHA-256 对请求进行签名,因此你无需添加摘要标志。同样的命令也适用于 FreeBSD 以及运行 Apache 的 macOS。

第一步:连接到你的 Apache 服务器

在 macOS 或 Linux 上打开终端(Terminal),或在 Windows 上打开 PowerShell 或 Windows Terminal,然后通过 SSH 连接到服务器。将用户名和主机替换为你自己的信息:

ssh your-user@your-apache-server

在将托管该证书的同一台服务器上生成 CSR。私钥会与 CSR 一起被创建,并且必须留在该服务器上,因此如果在笔记本电脑上运行该命令,然后再复制私钥,就失去了意义。你也可以在一个便于日后查找的专用目录中进行操作,例如:

sudo mkdir -p /etc/ssl/yourdomain
cd /etc/ssl/yourdomain

第二步:生成私钥和 CSR

如果你已经使用其他工具生成了 CSR,请直接跳转到在 Apache 上安装证书

运行以下 OpenSSL 命令。它会一步创建一个 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 位是公共证书当前的最低要求;你可以使用 rsa:4096 生成更大的密钥,或改用 ECDSA(见下文)。
  • -nodes 使私钥保持未加密状态,以便 Apache 在启动时可以读取它,而不需要输入密码短语。
  • -keyout-out 用于指定私钥文件和 CSR 文件的名称。
  • -subj 提供证书的主体信息。请在此处填写你真实的公司名称、州/省和城市,而不是占位符。CN(通用名称)是你的主域名。
  • -addext “subjectAltName=…” 列出该证书必须覆盖的每一个主机名。公共 CA 会根据 SAN 列表进行验证,因此这里也要包含通用名称。

请将全文中的 yourdomain.com 替换为你的实际域名。要覆盖其他主机名,可用逗号将它们添加到 SAN 列表中,例如 DNS:api.yourdomain.com。对于通配符证书,需同时包含通配符域名和裸域名:DNS:*.yourdomain.com,DNS:yourdomain.com。主体字段中只能使用字母数字字符,C 字段请使用官方的两字母国家代码。

如果你更倾向于使用 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 req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr,不带 -subj 也不带 -addext。OpenSSL 会依次询问每个字段。此时:

  • 国家名称(C):你所在国家的两字母 ISO 代码,例如 USGB。对于组织验证型或扩展验证型证书,这必须是你组织的官方注册所在国。
  • 州或省名称(ST):完整名称,例如 California。请不要使用缩写。
  • 地区名称(L):所在城市或城镇,例如 San Francisco
  • 组织名称(O):你公司的官方注册名称,例如 GPI Holding LLC。对于域名验证型证书,可以填写 NA
  • 组织单位名称(OU):该字段已被弃用,公共 CA 会忽略它。直接按 Enter 键留空即可。
  • 通用名称(CN):证书所对应的完全限定域名,例如 www.yourdomain.com。对于通配符证书,请使用 *.yourdomain.com
  • 电子邮件地址:可选项,公共 CA 不会使用该信息。你可以留空。
  • 挑战密码可选的公司名称:这两个都是过时的属性,公共 CA 会忽略它们。请留空。

如果不使用 -addext 标志,生成的 CSR 将没有任何 SAN 条目。公共 CA 会根据 SAN 列表进行验证,并会拒绝(或悄悄覆盖)没有该列表的请求,因此推荐的方式是使用上文中的内联 -subj-addext 命令。

第三步:定位你的文件

列出当前目录以确认两个文件都已创建:

ls

你应该会看到两个新文件:

  • yourdomain.key:你的私钥。请将其保存在服务器上,安全地进行备份,切勿将其发送给任何人,包括证书颁发机构。任何持有该密钥的人都可以冒充你的网站。
  • yourdomain.csr:你的证书签名请求。这是你要提交给 SSL 提供商的文件。

限制私钥的权限,使其只能被文件所有者读取:

chmod 600 yourdomain.key

第四步:验证 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 解码器中,在浏览器中查看相同的字段。

第五步:提交你的 CSR

要复制订单所需的 CSR,请打印其内容:

cat yourdomain.csr

你会看到类似这样的一段文本:

-----BEGIN CERTIFICATE REQUEST-----
MIICyzCCAbMCAQAwTDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQsw...
...(many more lines of base64 characters)...
-----END CERTIFICATE REQUEST-----

复制整个代码块,包括 —–BEGIN CERTIFICATE REQUEST—–—–END CERTIFICATE REQUEST—– 这两行(每个标记两侧各有五个连字符)。整个代码块就是你的 CSR。在购买过程中将其粘贴到订单表单中,并将匹配的私钥保留在服务器上。

如果你不想使用命令行,也可以使用我们的在线CSR 生成器来生成该请求。请注意,它会在你的浏览器中生成私钥,因此你需要自行保存该密钥并将其转移到服务器上。

在你的 CA 验证该请求后,你将收到证书。根据验证级别的不同,域名验证通常只需几分钟,而组织验证和扩展验证可能需要长达数个工作日。

第六步:在 Apache 上安装证书

证书到达后,将签发的证书(包括合并到一个完整链文件中的任何中间证书)和私钥放置在服务器上,然后在你网站的虚拟主机配置中指向它们:

SSLCertificateFile    /etc/ssl/yourdomain/fullchain.crt
SSLCertificateKeyFile /etc/ssl/yourdomain/yourdomain.key

现代版本的 Apache(2.4.8 及更高版本)会从传递给 SSLCertificateFile 的单个文件中读取叶证书和所有中间证书,因此请将你的证书和 CA 证书包合并到一个文件中。旧的 SSLCertificateChainFile 指令已被弃用,不应在当前版本的 Apache 中使用。使用 apachectl configtest 测试配置,然后重新加载 Apache 以应用更改。要了解完整的操作流程,请参阅我们的如何在 Apache 上安装 SSL 证书指南。

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

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

龙飞行的详细图像
撰写人

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