我有一台 Postfix Ubuntu VM 用作邮件中继服务器,它在端口 25 上接收邮件并将其转发到 Microsoft Exchange 在线进行传送。几个月来,它一直运行良好。
现在我需要允许必须使用 TLS 的 SMTP 客户端也通过中继发送电子邮件。我已将以下内容添加到我的 Postfix main.cf 中:
smtpd_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1
smtpd_tls_chain_files =
${cert_path}/cert.pem,
${cert_path}/chain.pem
但是,当我尝试使用 --tls-on-connect 标志的 swaks 时,我在端口 465 和 587 上收到“连接被拒绝”信息。旧的非加密端口 25 仍然有效。pem 文件由 Let's Encrypt 生成,私钥计数器部分用于加密发送到 Exchange online 的外发邮件。我已经使用以下方法验证了它们:
openssl verify -purpose sslserver -partial_chain -CAfile /etc/letsencrypt/live/<server FQDN>/chain.pem /etc/letsencrypt/live/<server FQDN>/cert.pem
但是,当我尝试从 SMTP 客户端建立 TLS 连接时,日志中会出现以下信息:
Mar 18 14:41:49 hermes postfix/smtpd[578652]: warning: error loading chain from /etc/letsencrypt/live/<server FQDN>/cert.pem: key not first
Mar 18 14:41:49 hermes postfix/smtpd[578652]: warning: error loading private keys and certificates from: /etc/letsencrypt/live/<server FQDN>/cert.pem,?/etc/letsencrypt/live/<server FQDN>/chain.pem: disabling TLS support
我想我面临的问题是如何使用 Let's Encrypt SSL 证书在我的邮件中继服务器上启用 TLS。
答案1
Certbotchain
和cert
文件均不包含服务器的私钥。两条错误消息都只是对此的抱怨。密钥仅包含在文件中privkey
。
如果您希望使用包含密钥和证书的单个文件,则需要手动连接文件(例如在后挂钩中)并确保内容privkey
首先出现,然后是cert
,然后是chain
,按照这个确切的顺序。
请注意,该文件已经是正确顺序的和fullchain
的连接。只需指向这个现成的证书文件即可。此外,Postfix 不需要将所有内容都放在一个文件中;有一个特定选项可以指向密钥文件。chain
cert
我像这样将 certbot 与 Postfix 一起使用:
smtpd_tls_cert_file = /etc/letsencrypt/live/example.org/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.org/privkey.pem