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 代码,例如 US 或 GB。对于组织验证型或扩展验证型证书,这必须是你组织的官方注册所在国。
  • 州或省名称(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 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.

Avatar of Sergiu Rosca
Technical Review by Sergiu Rosca

Sergiu Rosca is the core web developer behind SSL Dragon. He manages the technical infrastructure, platform performance, and backend integrations that keep the site running smoothly and securely. At SSL Dragon, Sergiu shares practical insights on web development, site optimization, and technical troubleshooting.

All SSL Dragon installation guides are tested on live server environments and undergo a strict peer-review process to ensure your infrastructure remains secure. Read our full Editorial Policy.