在本教程中,您将学习如何在 Postfix(流行的 Linux 邮件传输代理)上安装 SSL/TLS 证书。
我们还录制了一个视频,带您了解整个过程。请观看下方视频,或继续阅读文字版教程。
在 Postfix 上生成 CSR 代码
如果您已经生成了 CSR 代码,只需要安装步骤,请直接跳转至在 Postfix 上安装 SSL 证书。
要从受信任的 CA(证书颁发机构)获取 SSL 证书,您必须提交 CSR(证书签名请求)。CSR 是一段编码文本,其中包含您的联系信息和组织详情。您有两种选择:
- 使用我们的CSR 生成器自动创建 CSR。
- 按照我们关于如何在 Postfix 中生成 CSR的分步教程操作。
在与 SSL 供应商下单过程中,请在任意纯文本编辑器中打开 CSR 文件,并将整个文本块(包括 —–BEGIN CERTIFICATE REQUEST—– 和 —–END CERTIFICATE REQUEST—– 这两行)复制粘贴到相应的输入框中。一旦 CA 验证了您的请求并颁发证书后,即可继续进行下面的安装步骤。
在 Postfix 上安装 SSL 证书
当 CA 验证您的请求并将证书文件发送到您的邮箱后,您就可以开始安装了。
第 1 步:准备您的 SSL 文件
Postfix 使用X.509 格式的 SSL/TLS 证书。正确的安装需要三个文件:
- 您的私钥,与 CSR 一起在您的服务器上生成(例如 privkey.key)。
- 您的主 SSL 证书,即 CA 通过电子邮件发送给您的 ZIP 压缩包内的文件。在本指南中我们将其称为 server.crt。
- 中间证书,即同一 ZIP 压缩包中的CA 证书包。我们将其称为 intermediate.pem。
您可以将这三个文件保存在同一目录中,例如 /etc/postfix/。请确保私钥仅可由 root 用户读取:
sudo chmod 600 /etc/postfix/privkey.key
第 2 步:构建证书链
如何组合这些文件取决于您的 Postfix 版本。请先检查版本:
postconf mail_version
推荐方式(Postfix 3.4 及更新版本)
创建一个链文件,其中包含私钥、服务器证书和中间证书,顺序必须严格如下:
cat /path/to/privkey.key /path/to/server.crt /path/to/intermediate.pem > /etc/postfix/rsachain.pem
这种现代方法可以避免证书更替时出现的问题,并且能与 Postfix 的 smtpd_tls_chain_files 指令完美配合。请以与私钥相同的方式保护该链文件,因为其中包含您的私钥:
sudo chmod 600 /etc/postfix/rsachain.pem
替代方式(适用于所有 Postfix 版本)
如果您运行的 Postfix 版本低于 3.4,请将私钥单独保存,仅将服务器证书与中间证书合并:
cat /path/to/server.crt /path/to/intermediate.pem > /etc/postfix/server.pem
在下面的配置中,您将分别引用此证书包和私钥。
第 3 步:配置 Postfix
打开主配置文件 /etc/postfix/main.cf,并选择与您的设置相匹配的方式。
选项 A:Postfix 3.4 或更新版本(推荐)。将 Postfix 指向您所构建的单一链文件:
smtpd_tls_chain_files = /etc/postfix/rsachain.pem
smtpd_tls_security_level = may
选项 B:传统方式(Postfix 3.4 以下版本)。分别引用证书包和私钥:
smtpd_tls_cert_file = /etc/postfix/server.pem
smtpd_tls_key_file = /etc/postfix/privkey.key
smtpd_tls_security_level = may
关于这些指令的几点说明:
- smtpd_tls_security_level = may 为端口 25 上的入站邮件启用了机会性 TLS。这是公共 MX 服务器的正确设置:它会向支持 STARTTLS 的发件方通告该功能,同时仍然接受不支持该功能的发件方的明文连接。请勿在公共 MX 上将其设置为 encrypt,因为这样会拒绝来自仅支持明文的发件方的合法邮件。(旧的 smtpd_use_tls = yes 开关已被弃用;smtpd_tls_security_level 取代了它。)
- 无论是通过 smtpd_tls_chain_files(选项 A)还是 smtpd_tls_cert_file(选项 B)交付,都应使用完整证书链(您的证书加上中间证书)。仅提供叶证书会导致接收端出现链验证失败。
- 现代版本的 Postfix 默认已禁用 SSLv2、SSLv3 及弱加密套件,因此针对入站端口 25 流量,您无需额外的排除列表。
保护提交服务(端口 587)
当您自己的用户通过 Postfix 发送邮件时(通过 Outlook、Thunderbird、Apple Mail 等),他们会连接到提交(submission)端口 587,而非专用于服务器间投递的端口 25。由于只有您的经过身份验证的用户会使用此端口,您可以安全地实施更严格的规则:要求使用 TLS,并设置 TLS 1.2 为最低协议版本。
打开 /etc/postfix/master.cf,确保已启用 submission 服务,并添加以下覆盖设置:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_mandatory_protocols=>=TLSv1.2
有几个细节容易让人出错:
- smtpd_tls_mandatory_protocols 仅在安全级别为 encrypt(强制 TLS)时才生效,而这正是端口 587 上的情况。对于端口 25 上的机会性 TLS(安全级别为 may),应改用等效的 smtpd_tls_protocols 选项,但在公共 MX 上,通常应保留 Postfix 的默认设置,以免拒绝较旧的发件方。
- 紧凑写法 >=TLSv1.2 需要 Postfix 3.6 或更新版本,并且 >= 与版本号之间不能有空格。在 Postfix 3.4 或 3.5 上,应改用排除写法:smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1。
- 在 master.cf 中,-o 覆盖设置中的 = 两侧没有空格(例如 -o smtpd_tls_security_level=encrypt),而在 main.cf 中,您应写作 key = value,两侧带有空格。
可选:端口 465 上的隐式 TLS。许多现代客户端更倾向于使用端口 465(SMTPS / “submissions”),该端口从一开始就将整个会话包裹在 TLS 中。RFC 8314 与 587 一同认可了这种方式。要启用它,请在 master.cf 中以包装模式启用 smtps 服务:
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
第 4 步:重新加载 Postfix
在重新加载之前,最好先检查配置是否存在语法错误:
sudo postfix check
如果没有返回任何内容,即可应用更改。重新加载会重新读取配置,而不会中断现有连接:
sudo systemctl reload postfix
在没有 systemd 的系统上,等效命令为:
sudo postfix reload
第 5 步:验证证书
使用 OpenSSL 确认 Postfix 正在提供正确的证书和证书链。请将 yourdomain.com 替换为您邮件服务器的主机名:
openssl s_client -starttls smtp -connect yourdomain.com:25 -servername yourdomain.com </dev/null
| openssl x509 -noout -issuer -subject -dates
输出应显示您服务器证书的使用者、颁发者(CA)以及有效期。若要改为测试提交服务,请将端口改为 587(同样使用 STARTTLS),或者对于隐式 TLS 的端口 465,去掉 -starttls smtp 并直接连接到端口 465。恭喜,您已成功在 Postfix 上安装了 SSL 证书。
测试您的 SSL 安装
安装证书后,明智的做法是扫描您的配置,检查是否存在错误或漏洞。我们的 SSL Checker 会即时提供关于您证书及其设置各方面的报告,让您确认证书链是完整的,且协议配置正确。
在哪里购买适用于 Postfix 的最佳 SSL 证书?
您来对地方了。在 SSL Dragon,我们提供市场上种类最丰富、价格最实惠的 SSL 产品,且我们所有的证书都与 Postfix 邮件传输代理兼容。
不确定该选择哪种证书?我们的 SSL Wizard 可让您快速轻松地为您的邮件服务器找到合适的产品。
常见问题
TLS 是在 /etc/postfix/main.cf 中配置的。在 Postfix 3.4 及更新版本中,推荐的指令是 smtpd_tls_chain_files,它指向一个包含私钥、服务器证书和中间证书的单一 PEM 文件。在较旧版本中,您则需要分别设置 smtpd_tls_cert_file(完整证书链)和 smtpd_tls_key_file(私钥)。针对端口 587 和 465 的按服务覆盖设置位于 /etc/postfix/master.cf 中。
对于 smtpd_tls_chain_files,顺序是先私钥,然后是服务器(叶)证书,最后是中间证书:cat privkey.key server.crt intermediate.pem > /etc/postfix/rsachain.pem
如果顺序错误,Postfix 将无法加载该证书链。请勿包含根 CA 证书;客户端已经信任它。
对于端口 25 上的入站邮件,应使用 may(机会性 TLS)。公共 MX 必须接受来自不支持 TLS 的发件方的邮件,而 encrypt 会拒绝这些邮件,导致邮件丢失。应将 encrypt(强制 TLS)保留给端口 587 上的经过身份验证的提交服务,该端口仅供您自己的用户连接。
对于证书和 TLS 更改,重新加载即可;运行 sudo systemctl reload postfix(或 sudo postfix reload)。重新加载会重新读取配置,而不会中断现有连接。请先运行 sudo postfix check,以便在更改生效前发现语法错误。
使用 OpenSSL 进行连接,并读取 Postfix 通过 STARTTLS 展示的证书:openssl s_client -starttls smtp -connect yourdomain.com:25 -servername yourdomain.com </dev/null | openssl x509 -noout -issuer -subject -dates
这将打印出证书的使用者、颁发者以及有效期。您还可以使用我们的 SSL 工具 进行全面扫描,以确认证书链是完整的。
总结
在 Postfix 上安装 SSL 证书,归根结底就是组装一个完整的证书链 PEM 文件,通过 smtpd_tls_chain_files(或传统的 smtpd_tls_cert_file / smtpd_tls_key_file 组合)将 main.cf 指向它,为入站邮件设置 smtpd_tls_security_level = may,加固端口 587 上的提交服务,使用 sudo postfix check 检查配置,然后重新加载 Postfix。
还没有证书?浏览我们的 SSL 证书。


