设置 Postfix 的 TLS 加密后发信被对端拒绝了,怎么排查?
设置 Postfix 的 TLS 加密后发信被对端拒绝了,怎么排查?
问题背景:RFC 8314 自 2018 年起要求邮件系统强制使用 TLS,各大服务商也逐步废弃不加密的 SMTP 连接。但 TLS 配置不当(协议版本过旧、证书链不完整、cipher 不匹配)会使连接在握手阶段直接中断。
Step 1 — 确认协议版本:
postconf smtp_tls_protocols 查看当前允许的协议列表。建议显式排除不安全版本:postconf -e 'smtp_tls_protocols = !SSLv2, !TLSv1, !TLSv1.1',仅保留 TLSv1.2 和 TLSv1.3。很多对端服务器已拒绝 TLSv1 以下连接。Step 2 — 诊断证书验证:日志中出现 "certificate verification failed" 说明对端 TLS 证书未被本地信任。检查
postconf smtp_tls_CAfile 指向的 CA 证书包是否存在且为最新——RHEL 系通常为 /etc/pki/tls/certs/ca-bundle.crt,Debian 系为 /etc/ssl/certs/ca-certificates.crt。Step 3 — 反向测试对端:
openssl s_client -connect mx.receiver.com:25 -starttls smtp -tls1_2 直接测试目标服务器是否成功完成 TLS 握手。如果能通但 Postfix 不通,说明 Postfix 侧的配置有问题。Step 4 — 调整安全策略:如果设置了
smtp_tls_security_level=encrypt(强制加密)但对方不支持 TLS,将退信。建议日常使用 may 级别(机会性加密:对方支持则加密,不支持则降级为明文),仅在确认为可信对端且对方确认支持 TLS 的目标上使用 encrypt 或 dane 级别。📎 RFC 8314 TLS for Email;Postfix TLS_README
