Postfix 3.3.0对接Server 2019 AD启用STARTTLS报TLS上下文分配错误
问题诱因
- Postfix的smtpd进程默认运行在chroot环境中,根目录被限制为
/var/spool/postfix,你在配置中填写的tls_ca_cert_file = /var/spool/postfix/mydomain.tld.crt会被进程解析为/var/spool/postfix/var/spool/postfix/mydomain.tld.crt,对应路径下不存在证书文件,直接导致TLS上下文初始化失败。 - 执行
postmap测试时,该命令不会进入chroot环境,可以正常读取系统绝对路径下的证书文件,因此测试返回正常,和实际发信时的smtpd运行环境存在差异,这是排查时出现两种不同结果的核心原因。 - 若证书文件权限配置不当,postfix运行用户无读取权限,也会触发TLS上下文分配失败的报错。即便是将
tls_require_cert设为no,只要开启了start_tls,初始化TLS阶段读取CA配置失败就会抛出报错,只有关闭start_tls跳过TLS流程才会恢复正常。
解决步骤
- 调整LDAP配置中的证书路径
修改/etc/postfix/ldap-users.cf中的tls_ca_cert_file参数为chroot环境下的相对路径:
tls_ca_cert_file = /mydomain.tld.crt
smtpd进程进入chroot后,会直接读取/var/spool/postfix/mydomain.tld.crt文件,路径匹配你存放证书的位置。
- 修正证书文件权限
执行以下命令确保postfix用户有权读取证书:
chown root:postfix /var/spool/postfix/mydomain.tld.crt chmod 640 /var/spool/postfix/mydomain.tld.crt
- (可选)使用系统CA存储的配置方法
如果你不想单独维护域名根证书,想使用系统全局CA存储,需要将系统CA bundle同步到chroot目录:
# Debian/Ubuntu 执行以下命令 mkdir -p /var/spool/postfix/etc/ssl/certs cp /etc/ssl/certs/ca-certificates.crt /var/spool/postfix/etc/ssl/certs/ # CentOS/RHEL 执行以下命令 mkdir -p /var/spool/postfix/etc/pki/tls/certs cp /etc/pki/tls/certs/ca-bundle.crt /var/spool/postfix/etc/pki/tls/certs/
之后将ldap-users.cf中的tls_ca_cert_file参数修改为对应系统路径即可:
# Debian/Ubuntu tls_ca_cert_file = /etc/ssl/certs/ca-certificates.crt # CentOS/RHEL tls_ca_cert_file = /etc/pki/tls/certs/ca-bundle.crt
注意:系统CA证书更新后需要手动同步到chroot目录,也可编写系统更新钩子实现自动同步。
- 重启Postfix生效
执行命令重启服务验证配置:
systemctl restart postfix
重启后测试发信和postmap查询功能,确认无报错即可。
内容的提问来源于stack exchange,提问作者Tyler Montney
相关产品推荐
相关产品推荐

