bg-tutorials

如何在Qmail上生成CSR

本指南将向您展示如何在 qmail 上使用 OpenSSL 命令行生成 CSR(证书签名请求)。Qmail(以及其积极维护的分支 notqmail)没有内置的 CSR 工具。您需要使用 OpenSSL 一次性创建两个文件:一个保存在服务器上的私钥,以及一个提交给证书颁发机构(CA)的 CSR。

CSR 编码了服务器在 STARTTLS 期间呈现的邮件主机名、您的组织详细信息,以及密钥的公开部分。匹配的私钥永远不会离开服务器。如果您丢失了私钥,颁发的证书将无法使用,您必须重新生成一对新的密钥。

关于 qmail 和 notqmail 的说明:原始的 qmail 由 Daniel J. Bernstein 于 1998 年冻结,此后未收到任何上游更新。notqmail(最新版本:1.09,2024 年 5 月)是由社区维护的分支,增加了安全修复、当前构建兼容性和持续的可移植性工作。TLS 并不包含在其中:在 notqmail 上,与原始 qmail 一样,STARTTLS 来自一个外部补丁,1.09 版本发行说明记录了现有的 smtp-tls 补丁不适用于该版本,需要一个新的上游补丁。在订购证书之前,请检查您所运行版本的补丁状态。CSR 生成过程对两者是相同的,因为它使用的是 OpenSSL,而不是任何 qmail 二进制文件。如果您仍在运行原始的 qmail,请考虑迁移到 notqmail 或 Postfix 以获得持续的安全支持。

前提条件

  • 运行 qmail(或 notqmail)的服务器的 root 或 sudo 访问权限。
  • 已安装 OpenSSL。它在每个主流 Linux 和 BSD 发行版的基础系统中都自带。可以使用 openssl version 检查。
  • 您想要在证书上使用的完全限定邮件主机名,例如 mail.example.com。这必须与客户端通过 STARTTLS 连接的 MX 记录一致,而不是裸的顶级域名。

第 1 步:为密钥和 CSR 准备一个目录

Qmail-smtpd 从 /var/qmail/control/servercert.pem 读取其 TLS 证书,这是 TLS 补丁硬编码的路径。为密钥材料创建一个子目录,并将其锁定为仅限 root 访问:

sudo mkdir -p /var/qmail/control/ssl
sudo chmod 700 /var/qmail/control/ssl
cd /var/qmail/control/ssl

您将在此目录中生成密钥和 CSR。CA 颁发证书后,您需要将这些文件合并到 qmail-smtpd 在启动时读取的 servercert.pem 中。

第 2 步:生成私钥和 CSR

运行以下命令。它会一步创建私钥和 CSR,并包含现代邮件客户端和 CA 所要求的主题备用名称(SAN)。SAN 必须列出邮件主机名(即您的 MX 记录所指向的名称):

sudo openssl req -new -newkey rsa:2048 -nodes 
-keyout /var/qmail/control/ssl/mail.example.com.key 
-out /var/qmail/control/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 使私钥保持未加密状态(无口令),这样 qmail-smtpd 可以在启动时加载它,而无需提示输入。
  • -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 /var/qmail/control/ssl/mail.example.com.key 
-out /var/qmail/control/ssl/mail.example.com.csr 
-addext "subjectAltName=DNS:mail.example.com"

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

涵盖多个主机名

如果同一个 qmail 实例响应多个名称(例如 mail.example.com 和 smtp.example.com),请在 SAN 值中列出每个主机名,用逗号分隔:

-addext "subjectAltName=DNS:mail.example.com,DNS:smtp.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 /var/qmail/control/ssl/mail.example.com.key 
-out /var/qmail/control/ssl/mail.example.com.csr 
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=mail.example.com" 
-addext "subjectAltName=DNS:mail.example.com"

请注意,带有 DJB TLS 补丁的原始 qmail 可能不支持 ECDSA。如果您运行的是配备当前 OpenSSL 的 notqmail,ECDSA 可以正常运行。

第 3 步:保护私钥

将私钥锁定,使其只有 root 可以读取。原始密钥文件仅在您稍后构建合并的 servercert.pem 时才需要,因此 root 所有权和 600 权限模式是正确的做法:

sudo chown root:root /var/qmail/control/ssl/mail.example.com.key
sudo chmod 600 /var/qmail/control/ssl/mail.example.com.key

CSR 文件不是机密文件(它只包含公钥和您的主题详情),但将其保存在同一个已锁定的目录中可以保持结构整洁。

第 4 步:验证 CSR

在提交请求之前,请确认它包含正确的主机名和 SAN,并且其签名有效:

openssl req -noout -text -verify -in /var/qmail/control/ssl/mail.example.com.csr

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

第 5 步:提交 CSR

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

cat /var/qmail/control/ssl/mail.example.com.csr

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

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

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

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

文件在 qmail 中的存放位置

为便于理解,一旦 CA 返回证书和中间证书(CA 捆绑包),您刚刚生成的文件就会以这种方式接入 qmail。Qmail-smtpd 从位于 /var/qmail/control/servercert.pem 的单个合并 PEM 文件中读取其 TLS 材料。该文件必须按此顺序包含私钥、服务器证书和中间证书,依次连接:

cat mail.example.com.key mail.example.com.crt intermediate.pem 
> /var/qmail/control/servercert.pem
sudo chown root:nofiles /var/qmail/control/servercert.pem
sudo chmod 640 /var/qmail/control/servercert.pem

nofiles 组是 qmail-smtpd 运行所使用的 qmaild 用户的默认组。640 权限模式让 qmaild 可以通过组成员身份读取该文件,同时使其对其他用户不可读。如果您的系统对 qmaild 使用了不同的组,请在 chown 命令中替换为该组名称。

只有在构建时启用了 TLS 支持的情况下,qmail-smtpd 才能提供 STARTTLS,而原始 qmail 和 notqmail 都不会自带这一功能。两者常用的方式是 Frederik Vermeulen 的 qmail-tls 补丁:正是这个补丁使 qmail-smtpd 读取 servercert.pem,并在该文件就位后立即宣告支持 STARTTLS。另一种方式是 Erwin Hoffmann 的带有 ucspi-ssl 的 s/qmail,其中 sslserver 在 /service/qmail-smtpd/run 中导出 UCSPITLS 环境变量,密钥存放在单独的 serverkey.pem 中,因此上述单文件布局并不适用于此种方式。放置好合并的 PEM 文件后,重启 qmail-smtpd 服务:

sudo svc -t /service/qmail-smtpd

完整的安装演练,包括使用 OpenSSL 验证证书链,请参阅我们的 qmail SSL 安装指南。

安装后验证 STARTTLS

证书安装完成后,请确认您的服务器宣告支持 STARTTLS 并提供有效的证书链:

openssl s_client -connect mail.example.com:25 -starttls smtp -servername mail.example.com

查找 Verify return code: 0 (ok),并确认主题和颁发者与您的证书相符。您还可以使用我们的 SSL Checker 扫描服务器,以获取证书链和过期日期的可视化报告。

在其他邮件平台上生成 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.