在运行 Debian Wheezy 的面向互联网的 Postfix SMTP 服务器上,我想与一些已知服务器建立安全连接。有些是我自己的,运行我自己的 PKI/CA,有些是公共 SMTP 服务器,如 Google 的 Gmail 服务器。为了检查我自己运行的服务器上的证书,我指定了
smtp_tls_CAfile = /usr/local/share/ca-certificates/Gert_van_Dijk_Root_CA_2014.crt
为了确保公共服务器也可以根据内置系统证书存储进行验证,我明确指定了
tls_append_default_CA = yes
为了确保 Postfix 正确验证证书,我将全局 TLS 安全级别设置为“安全”。一旦我完成了此处描述的此问题的调试,我将把某些域的级别改回“可能secure
” smtp_tls_policy_maps
。
smtp_tls_security_level = secure
它能很好地验证我自己的服务器!它们都使用 签名的证书运行Gert_van_Dijk_Root_CA_2014.crt
。但是,SMTP 客户端tls_append_default_CA
在尝试将邮件发送到 Google 的 SMTP 服务器时似乎并没有根据设置附加证书。我希望它会附加/etc/ssl/certs
Debian 上的证书。
postfix/smtp[32271]: effective TLS level: secure
[...]
postfix/smtp[32271]: < alt1.gmail-smtp-in.l.google.com[64.233.164.26]:25: 220 2.0.0 Ready to start TLS
[...]
postfix/smtp[32271]: DE6D0403EB: Server certificate not verified
这是我尝试过的:
master.cf
像这样禁用 smtp 客户端的chroot :smtp unix - - n - - smtp
没有帮助。
添加详细日志记录。我已将其添加
-v
到上面的行中。不得不禁用 rsyslog 速率限制,但这并没有改善任何事情。它提到的有关 TLS 验证的唯一一行就是该DE6D0403EB: Server certificate not verified
行。尝试跟踪该过程以查看它是否在访问 CA 证书时遇到任何问题。看来 SMTP 客户端在每次传递尝试时都会生成一个新进程。这使得一般情况变得
strace -p <PID>
不可能。搜索类似问题。我似乎只找到这个非常相似的问题,但这就是不是指定
smtp_tls_CAfile
设置,我就是这样做的。有了一套smtp_tls_CAfile
,它应该真的附加系统范围的 CA 证书。将所有文件恢复为 Debian 默认设置,但 除外
smtp_tls_security_level = secure
。它也无法向 Google 发送,并出现完全相同的错误。那么 Debian 的 Postfix 中存在错误吗?与上述相同,然后禁用 SMTP 客户端的 chroot,然后
smtp_tls_CApath = /etc/ssl/certs
明确设置。证书验证仍然失败。添加 TLS 调试级别。显示:
postfix/tlsmgr[17486]: write smtp TLS cache entry smtp:64.233.164.26:25:mx.google.com&p=1&c=aNULL:-aNULL:ALL:!EXPORT:!LOW:+RC4:@STRENGTH:!aNULL&l=268439647: time=1421622891 [data 1975 bytes] postfix/smtp[17485]: alt1.gmail-smtp-in.l.google.com[64.233.164.26]:25: subject_CN=mx.google.com, issuer_CN=Google Internet Authority G2, fingerprint 88:C0:85:C8:CB:96:29:8F:4E:15:11:80:C5:9A:89:0D, pkey_fingerprint=E0:32:29:21:69:38:EA:F9:B6:0C:F6:BD:86:12:16:B9 postfix/smtp[17485]: Untrusted TLS connection established to alt1.gmail-smtp-in.l.google.com[64.233.164.26]:25: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits) postfix/smtp[17485]: DE6D0403EB: Server certificate not trusted
在同一系统上进行的 OpenSSL 手动验证表明一切确实正常。
$ openssl s_client -connect 64.233.164.26:25 -starttls smtp CONNECTED(00000003) depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA verify error:num=20:unable to get local issuer certificate verify return:0
通过禁用 tlsmgr 的 chroot,我终于得到了一个
Trusted TLS connection established
,但 postfix 仍然认为连接不安全(Server certificate not verified
):postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: certificate verification depth=3 verify=1 subject=/C=US/O=Equifax/OU=Equifax Secure Certificate Authority postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: certificate verification depth=2 verify=1 subject=/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: certificate verification depth=1 verify=1 subject=/C=US/O=Google Inc/CN=Google Internet Authority G2 postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: certificate verification depth=0 verify=1 subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mx.google.com postfix/smtp[27198]: SSL_connect:SSLv3 read server certificate A postfix/smtp[27198]: SSL_connect:SSLv3 read server key exchange A postfix/smtp[27198]: SSL_connect:SSLv3 read server done A postfix/smtp[27198]: SSL_connect:SSLv3 write client key exchange A postfix/smtp[27198]: SSL_connect:SSLv3 write change cipher spec A postfix/smtp[27198]: SSL_connect:SSLv3 write finished A postfix/smtp[27198]: SSL_connect:SSLv3 flush data postfix/smtp[27198]: SSL_connect:SSLv3 read server session ticket A postfix/smtp[27198]: SSL_connect:SSLv3 read finished A postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: aspmx.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt1.aspmx.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt2.aspmx.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt3.aspmx.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt4.aspmx.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: gmail-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt1.gmail-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt2.gmail-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt3.gmail-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt4.gmail-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: gmr-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt1.gmr-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt2.gmr-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt3.gmr-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: alt4.gmr-smtp-in.l.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: mx.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: aspmx2.googlemail.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: aspmx3.googlemail.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: aspmx4.googlemail.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subjectAltName: aspmx5.googlemail.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25 CommonName mx.google.com postfix/smtp[27198]: gmail-smtp-in.l.google.com[173.194.67.26]:25: subject_CN=aspmx.l.google.com, issuer_CN=Google Internet Authority G2, fingerprint 88:C0:85:C8:CB:96:29:8F:4E:15:11:80:C5:9A:89:0D, pkey_fingerprint=E0:32:29:21:69:38:EA:F9:B6:0C:F6:BD:86:12:16:B9 postfix/smtp[27198]: Trusted TLS connection established to gmail-smtp-in.l.google.com[173.194.67.26]:25: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits) postfix/smtp[27198]: DE6D0403EB: Server certificate not verified
有没有办法调试 SMTP客户在前台运行的 Postfix 中?所有调试内容似乎都与 smtpd 进程有关。:-(
相关进一步配置:
# postconf -n | grep -E "^(smtp_|tls_)"
smtp_tls_CAfile = /usr/local/share/ca-certificates/Gert_van_Dijk_Root_CA_2014.crt
smtp_tls_security_level = secure
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
tls_append_default_CA = yes
# /etc/postfix/master.cf:
tlsmgr unix - - n 1000? 1 tlsmgr
smtp unix - - n - - smtp -v
答案1
使用smtp_tls_security_level = secure
默认值smtp_tls_secure_cert_match
(smtp_tls_secure_cert_match = nexthop, dot-nexthop),postfix 将不信任 MX 记录的结果。换句话说,postfix 将使用从内部表(如传输表)获得的下一跳。
这就是为什么 postfix 仍然显示未验证服务器证书。Postfix 文档明确指出
已验证(由受信任的 CA 签名的对等证书以及经过验证的对等名称;或:具有预期公钥或证书指纹的对等证书)
Postfix SMTP 客户端:远程 SMTP 服务器的证书由 Postfix SMTP 客户端信任的 CA 签名,并且证书名称与目标或服务器名称匹配。Postfix SMTP 客户端配置为需要经过验证的名称,否则验证状态将仅为“受信任”。
您可能要减少到smtp_tls_security_level
,verified
以便 Postfix 将信任 MX 记录的结果并将其用于验证过程。另一种方法在postfix 文档。
不带传输 (5) 表覆盖的安全通道 TLS
Postfix 将用于
smtp_tls_policy_maps
进行验证过程。具有传输(5)表覆盖的安全通道 TLS:
在这种情况下,到 example.com 及其相关域的流量将被发送到单个逻辑网关(为避免单点故障,其名称可能解析为一个或多个负载平衡器地址,或多个物理主机的组合地址)。所有可通过网关 IP 地址访问的物理主机的证书中都列出了逻辑网关名称。