📬 Postfix TLS 证书验证失败(untrusted issuer)修复

📅 2026-03-16 👤 szlinux-btc #Linux #Postfix #TLS #SLES
问题概述
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
MTAPostfix 2.5.13
SMTP 中继smtp.example.com:587(STARTTLS,域名已脱敏)
服务器证书 CADigiCert Global Root CA(DigiCert 签发)

3. 根本原因分析

Postfix 的 TLS 证书验证路径由配置决定,本案有两条路径:

❌ 实际生效(有问题)
smtp_tls_CAfile = /etc/postfix/server.pem
该文件 未包含 DigiCert Global Root CA,Postfix 优先使用 CAfile,忽略系统 CA 目录。
✅ 系统 CA 目录(未被使用)
/etc/ssl/certs/ 已有完整根证书,但因 CAfile 优先级更高而未被 Postfix 读取。
💡 Postfix 规则
同时配置 smtp_tls_CAfilesmtp_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 可能还包含其他中间证书,备份后可随时回滚。

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. 注意事项

8. 总结

根因是 Postfix 自定义 CA 文件(/etc/postfix/server.pem)缺失了 DigiCert Global Root CA 根证书,导致 TLS 握手验证链断裂。

修复方式简单直接:将缺失的根证书追加到该文件末尾,重启 Postfix 即可。

如需彻底规避此类问题,建议长期切换为 smtp_tls_CApath 方案,依赖系统维护的 CA 目录,减少手动管理成本。

✅ 修复后:日志无警告 · TLS 加密连接完整验证 · 邮件正常发送

← 返回首页