bg-tutorials

如何在Postfix上生成CSR

本指南向您展示如何在 Postfix 上使用 OpenSSL 命令行生成 CSR(证书签名请求)。Postfix 本身不生成密钥或 CSR;它只是使用 OpenSSL 生成的文件,并在 /etc/postfix/main.cf 中引用它们。您只需运行一条命令即可同时创建两个文件:一个保留在服务器上的私钥,以及您提交给证书颁发机构(CA)的 CSR。

CSR 编码了您的 MTA 在 STARTTLS 上呈现的主机名、您的组织详情,以及密钥的公钥部分。与之匹配的私钥永远不会离开服务器。如果丢失了它,颁发的证书将无法使用,您必须重新开始整个流程。

前提条件

  • 对运行 Postfix 的服务器拥有 root 或 sudo 访问权限。
  • 已安装 OpenSSL。它随每个主流 Linux 发行版的基础系统一起提供;使用 openssl version 检查。
  • 您希望在证书上使用的完全限定邮件主机名,例如 mail.example.com。这必须与客户端通过 STARTTLS 连接的 MX 记录相匹配,而不是裸顶级域名。

步骤 1:为密钥和 CSR 准备目录

将 Postfix TLS 相关材料保存在 /etc/postfix/ 下的独立目录中,以便更容易管理权限。创建该目录并将其锁定为仅 root 可访问:

sudo mkdir -p /etc/postfix/ssl
sudo chmod 700 /etc/postfix/ssl
cd /etc/postfix/ssl

您将在此目录内生成密钥和 CSR,待 CA 颁发证书后再在 main.cf 中引用它们。

步骤 2:生成私钥和 CSR

运行下面的命令。它会一步创建私钥和 CSR,并包含现代浏览器、邮件客户端和 CA 都要求的主题备用名称(SAN)。SAN 必须列出邮件主机名(即您的 MX 记录所指向的名称),而不是裸顶级域名:

sudo openssl req -new -newkey rsa:2048 -nodes 
-keyout /etc/postfix/ssl/mail.example.com.key 
-out /etc/postfix/ssl/mail.example.com.csr 
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=mail.example.com" 
-addext "subjectAltName=DNS:mail.example.com"

以下是每个部分的作用:

  • req -new 创建一个新的证书签名请求。
  • -newkey rsa:2048 生成一个新的 2048 位 RSA 私钥。2048 位是公共证书当前的最低要求;您也可以使用 rsa:4096 生成更大的密钥。
  • -nodes 使私钥保持未加密状态(无密码短语),这样 Postfix 在启动时可以直接加载它,无需提示输入。
  • -keyout 用于写入私钥。请将此文件保密,切勿发送给任何人,包括 CA。
  • -out 用于写入您提交给 CA 的 CSR。
  • -subj 以内联方式填写主题字段,使命令无需交互式提示即可运行。将 CN(通用名称)设置为您的邮件主机名。
  • -addext “subjectAltName=…” 添加 SAN 条目。CA 是根据 SAN 列表颁发证书的,因此邮件主机名必须出现在此处。

mail.example.com 替换为客户端实际连接的主机名(通常与您的 MX 记录名称相同),并编辑 -subj 的值以匹配您的组织信息。两字母国家代码(C)必须为大写,例如 USGB。对于域名验证(DV)证书,组织字段不会被验证,但命令仍需要有效的值。现代版本的 OpenSSL 默认使用 SHA-256 对 CSR 进行签名,这也是所有公共 CA 的要求。

如果您希望以交互方式填写字段,而不是使用 -subj,可以省略该行,OpenSSL 会逐一提示您输入每个值:

sudo openssl req -new -newkey rsa:2048 -nodes 
-keyout /etc/postfix/ssl/mail.example.com.key 
-out /etc/postfix/ssl/mail.example.com.csr 
-addext "subjectAltName=DNS:mail.example.com"

出现提示时,请按 Enter 键将挑战密码可选公司名称留空。CA 会忽略这些字段,而挑战密码日后可能会引发问题。

覆盖多个主机名

如果同一个 Postfix 实例要响应多个名称(例如 mail.example.comsmtp.example.com,或者邮件与网邮共用同一证书),请在 SAN 值中列出每个主机名,并用逗号分隔:

-addext "subjectAltName=DNS:mail.example.com,DNS:smtp.example.com,DNS:webmail.example.com"

通用名称仍应为主邮件主机名。只有当邮件客户端会直接连接到裸顶级域名时,将其添加到 SAN 中才有意义;如果您的 MX 记录指向某个子主机名,则无需在证书中包含裸顶级域名。

更倾向于使用 ECDSA 密钥?

在相同的安全级别下,ECDSA 密钥比 RSA 更小、更快,并且受到当前所有邮件客户端和 CA 的支持。要生成 P-256(prime256v1)密钥和 CSR,请替换 -newkey 参数:

sudo openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes 
-keyout /etc/postfix/ssl/mail.example.com.key 
-out /etc/postfix/ssl/mail.example.com.csr 
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=mail.example.com" 
-addext "subjectAltName=DNS:mail.example.com"

步骤 3:保护私钥

将私钥锁定,使只有 root 才能读取。Postfix 在放弃特权之前会打开其 TLS 相关材料,因此 root 所有权和 600 权限模式都是正确且必需的:

sudo chown root:root /etc/postfix/ssl/mail.example.com.key
sudo chmod 600 /etc/postfix/ssl/mail.example.com.key

CSR 文件并非机密(它仅包含公钥和您的主题详情),但将它保存在同一个受限目录中可以保持文件结构整洁。

步骤 4:验证 CSR

在提交请求之前,请确认它包含正确的主机名和 SAN,并且其签名是有效的。以下命令会打印解码后的内容,并在本地检查签名:

openssl req -noout -text -verify -in /etc/postfix/ssl/mail.example.com.csr

请在输出中查找 verify OK,检查 Subject 行是否将您的邮件主机名显示为通用名称,并确认 X509v3 Subject Alternative Name 部分列出了您期望的每个主机名。如果缺少某个 SAN,请使用正确的 -addext 值重新生成 CSR:CA 在颁发证书后无法添加主机名。您也可以将 CSR 粘贴到我们的在线CSR 解码器中,在浏览器里检查这些字段。

步骤 5:提交 CSR

打开 CSR 文件,复制其全部内容,包括 BEGIN 和 END 行:

cat /etc/postfix/ssl/mail.example.com.csr

该文本块看起来如下所示。请从第一行复制到最后一行,包括 BEGIN 和 END 标记两侧的五个连字符:

-----BEGIN CERTIFICATE REQUEST-----
MIIC...base64-encoded data...AB
-----END CERTIFICATE REQUEST-----

将该文本块粘贴到您的 SSL 订单表单中。CA 验证 CSR 并颁发证书后,请按照我们的Postfix SSL 安装说明进行部署。请将 .key 文件保留在服务器上:您需要它与颁发的证书一起才能提供 STARTTLS 服务,并且绝不能将其发送给 CA 或任何其他人。

如果您不想使用命令行,可以使用我们的CSR 生成器构建请求,并将结果粘贴到您的订单中。该生成器会返回与之匹配的私钥,您需要将其放置在服务器上相同的路径下。

这些文件在 Postfix 中的存放位置

作为背景信息,一旦 CA 返回证书和中间证书(CA 证书包),您刚才生成的文件就会以如下方式接入 Postfix。在 Postfix 3.4 及更新版本中,推荐使用单一指令形式,该形式使用一个包含私钥和完整证书链的 PEM 文件:

cat mail.example.com.key mail.example.com.crt intermediate.pem 
> /etc/postfix/ssl/mail.example.com.chain.pem
sudo chmod 600 /etc/postfix/ssl/mail.example.com.chain.pem

然后在 /etc/postfix/main.cf 中:

smtpd_tls_chain_files = /etc/postfix/ssl/mail.example.com.chain.pem
smtpd_tls_security_level = may

在低于 3.4 版本的 Postfix 中,使用旧版的一对指令,密钥和完整链证书分别存放在不同的文件中:

smtpd_tls_cert_file = /etc/postfix/ssl/mail.example.com.fullchain.crt
smtpd_tls_key_file  = /etc/postfix/ssl/mail.example.com.key
smtpd_tls_security_level = may

完整的安装流程,包括 587 端口上的提交服务以及使用 OpenSSL 进行的验证,均详见我们的Postfix SSL 安装指南

在其他邮件平台上生成 CSR

正在使用其他邮件服务器或网关?请查看我们的其他 CSR 指南:

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

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

龙飞行的详细图像
撰写人

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