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)必须为大写,例如 US 或 GB。对于域名验证(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.com 和 smtp.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 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.

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.