Postfix SMTP 客户端未使用 tls_append_default_CA 验证系统范围的 CA 证书

Postfix SMTP 客户端未使用 tls_append_default_CA 验证系统范围的 CA 证书

在运行 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 安全级别设置为“安全”。一旦我完成了此处描述的此问题的调试,我将把某些域的级别改回“可能securesmtp_tls_policy_maps

smtp_tls_security_level = secure

它能很好地验证我自己的服务器!它们都使用 签名的证书运行Gert_van_Dijk_Root_CA_2014.crt。但是,SMTP 客户端tls_append_default_CA在尝试将邮件发送到 Google 的 SMTP 服务器时似乎并没有根据设置附加证书。我希望它会附加/etc/ssl/certsDebian 上的证书。

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_levelverified以便 Postfix 将信任 MX 记录的结果并将其用于验证过程。另一种方法在postfix 文档

  • 不带传输 (5) 表覆盖的安全通道 TLS

    Postfix 将用于smtp_tls_policy_maps进行验证过程。

  • 具有传输(5)表覆盖的安全通道 TLS:

    在这种情况下,到 example.com 及其相关域的流量将被发送到单个逻辑网关(为避免单点故障,其名称可能解析为一个或多个负载平衡器地址,或多个物理主机的组合地址)。所有可通过网关 IP 地址访问的物理主机的证书中都列出了逻辑网关名称。

相关内容