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