📬 Postfix TLS 证书验证失败(untrusted issuer)修复
问题概述
SLES 11 SP2 环境下,自定义 CA 文件缺失根证书导致 TLS 握手警告的完整修复记录。
SLES 11 SP2 环境下,自定义 CA 文件缺失根证书导致 TLS 握手警告的完整修复记录。
1. 问题现象
在生产环境 SLES 11 SP2 上,Postfix 发送邮件后 /var/log/mail 出现如下警告。邮件最终发出(status=sent),但 TLS 加密连接实际上未被验证,存在安全风险。
# /var/log/mail 中的错误片段(域名已脱敏)
postfix/smtp[XXXX]: certificate verification failed for
smtp.example.com[x.x.x.x]:587:
untrusted issuer /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
⚠️ 虽然邮件能发出,但 TLS 处于"降级验证"状态——中间人攻击风险敞口未关闭。
2. 环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | SLES 11 SP2 |
| MTA | Postfix 2.5.13 |
| SMTP 中继 | smtp.example.com:587(STARTTLS,域名已脱敏) |
| 服务器证书 CA | DigiCert Global Root CA(DigiCert 签发) |
3. 根本原因分析
Postfix 的 TLS 证书验证路径由配置决定,本案有两条路径:
❌ 实际生效(有问题)
该文件 未包含 DigiCert Global Root CA,Postfix 优先使用 CAfile,忽略系统 CA 目录。
smtp_tls_CAfile = /etc/postfix/server.pem该文件 未包含 DigiCert Global Root CA,Postfix 优先使用 CAfile,忽略系统 CA 目录。
✅ 系统 CA 目录(未被使用)
/etc/ssl/certs/ 已有完整根证书,但因 CAfile 优先级更高而未被 Postfix 读取。
💡 Postfix 规则
同时配置
同时配置
smtp_tls_CAfile 和 smtp_tls_CApath 时,CAfile 优先,CApath 被忽略。
4. 修复步骤
4.1 确认系统已存在正确的根证书
# 检查根证书文件是否存在
ls /etc/ssl/certs/DigiCert_Global_Root_CA.pem
# 验证证书主题
openssl x509 -in /etc/ssl/certs/DigiCert_Global_Root_CA.pem -subject -noout
# 预期输出:
# subject=C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
4.2 备份现有 CA 文件
cp /etc/postfix/server.pem /etc/postfix/server.pem.bak
📌 备份是关键
server.pem 可能还包含其他中间证书,备份后可随时回滚。
server.pem 可能还包含其他中间证书,备份后可随时回滚。
4.3 将根证书追加到 CA 文件
# 追加,不覆盖原有内容
cat /etc/ssl/certs/DigiCert_Global_Root_CA.pem >> /etc/postfix/server.pem
4.4 重启 Postfix
# SLES 11 使用 rcapostfix(注意:不是 systemctl)
rcapostfix restart
5. 验证方法
5.1 发送测试邮件
echo "Test email body" | mail -s "TLS Verify Test" recipient@example.com
5.2 监控日志,确认警告消失
tail -f /var/log/mail
✅ 修复成功标志
日志中不再出现
日志中不再出现
certificate verification failed,且邮件状态仍为 status=sent。
5.3 可选:用 openssl 手动验证服务器证书
# 用系统 CA 路径直接测试(smtp.example.com 已脱敏)
openssl s_client -connect smtp.example.com:587 -starttls smtp -CApath /etc/ssl/certs
# 最后一行应显示:
# Verify return code: 0 (ok)
6. 延伸方案:直接使用系统 CA 路径
如果希望 Postfix 始终跟随系统 CA 目录(推荐长期维护的做法),可修改 /etc/postfix/main.cf:
# 注释掉自定义 CAfile
#smtp_tls_CAfile = /etc/postfix/server.pem
# 改用系统 CA 目录
smtp_tls_CApath = /etc/ssl/certs
rcapostfix restart
⚠️ 使用 CApath 方案需确保系统 CA 目录定期更新(如通过 ca-certificates 软件包),否则同样可能出现新 CA 缺失的问题。
7. 注意事项
- 避免自定义 CAfile 碎片化:若多个服务共用一个自定义 CA 文件,后续新增 CA 时易遗漏,建议统一管理或切换为 CApath。
- SLES 11 证书更新:SLES 11 SP2 已 EOL,系统 CA 库可能陈旧,建议手动同步 Mozilla CA bundle。
- 变更影响评估:追加根证书前确认 server.pem 中是否还有其他中间证书,追加不会影响已有条目。
- 日志监控:修复后建议观察 1~2 天的邮件日志,确保无新的 TLS 警告。
8. 总结
根因是 Postfix 自定义 CA 文件(/etc/postfix/server.pem)缺失了 DigiCert Global Root CA 根证书,导致 TLS 握手验证链断裂。
修复方式简单直接:将缺失的根证书追加到该文件末尾,重启 Postfix 即可。
如需彻底规避此类问题,建议长期切换为 smtp_tls_CApath 方案,依赖系统维护的 CA 目录,减少手动管理成本。
✅ 修复后:日志无警告 · TLS 加密连接完整验证 · 邮件正常发送