exim4 检查客户端证书始终无效

exim4 检查客户端证书始终无效

我的 exim 服务器配置为在建立连接时要求提供客户端证书。我设置了一个 ACL(在 rcpt 阶段)来记录或添加证书检查结果的标头:

warn
   encrypted = *
   ! verify = certificate
   #condition = ${if def:tls_in_peerdn {yes}{no}}   # -> newer versions of exim use $tls_in_peerdn!
   condition = ${if def:tls_peerdn {yes}{no}} 
   add_header = X-TLS-Client-Certificate: invalid (${tls_peerdn})
   log_message = Invalid TLS client certificate presented (${tls_peerdn}).

warn
   encrypted = *
   ! verify = certificate
   condition = ${if def:tls_peerdn {no}{yes}} 
  log_message = No TLS client certificate presented.

warn
   verify = certificate  
   add_header = X-TLS-Client-Certificate: valid
   condition = false

不幸的是,我看到的所有消息都没有被检查为有效。但是,无证书检查是有效的。

我设立

tls_try_verify_hosts = *

因此进行检查,并且(使用 Debian,它包含在标准配置中)信任锚已配置并可访问:

tls_verify_certificates = /etc/ssl/certs/ca-certificates.crt

测试...

openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -verify 4 -connect mailserver.dom.tld:25 -starttls smtp -cert /etc/ssl/letsencrypt/fullchain.pem -key /etc/ssl/letsencrypt/privkey.pem

...从服务器到其自身使用与服务器相同的密钥,以正确的顺序包含中间证书不会给出有效的检查结果。

我错过了什么?

答案1

如果您的服务器使用默认配置,则应该使用snakeoil自签名证书。这对于在传出和传入连接上建立 TLS 连接是足够且可接受的。但是它将无法通过验证。您需要使用来自受信任机构的证书才能通过验证。

您是否向客户端提供证书,以便他们代替登录使用?除了向用户提供用户证书外,我预计客户端证书会经常失败。许多服务器使用自签名证书,或者存在其他会导致验证失败的问题。

tls_verify_hosts除非您设置或,否则 Exim 不会要求提供客户端证书tls_try_verify_hosts。证书在加密 SMTP 连接Exim 文档的部分。

许多组织都难以正确配置 DNS 以用于 STMP。DKIM 尤其麻烦,我遇到的大多数签名者都无法通过验证。我几乎不指望许多网站都为其服务器配置了正确的有效证书。

在最近限制与 TLS v1.0 及以上版本的连接后,我不得不停止STARTTLS向许多服务器发布公告。我还没有尝试验证任何客户端的 TLS 证书。如果我这样做,最多也只能算作垃圾邮件分数。我可能会启用tls_peerdn日志选择器来调查是否有任何网站可以通过验证。

SMTP over TLS 正在发展,但还远远未达到标准。使用它的网站都是通过其他方式获得高度信任的网站。

更新:我检查了我的日志,到目前为止,只有两个发件人通过了验证。大多数客户端均未通过验证。

我尝试验证我的证书:

  • OpenSSL 连接openssl.client.net不应通过 rDNS 验证。
  • fullchain.cert 不会追溯到默认信任存储中的证书。这是可以接受的,因为链证书是由信任存储中的证书签名的。
  • 看来 openssl 甚至没有尝试发送客户端证书。可能是因为信任链。如果您将第三个证书添加到 fullchain.pem 文件中,它可能会起作用。
  • 我看到了列出的服务器的 DN,但没有迹象表明 open_ssl 甚至尝试发送证书。

我使用的测试命令是:

echo quit | openssl s_client -cert fullchain.pem -key privkey.pem \
   -starttls smtp -connect mail.systemajik.com:587 -debug 2>&1 | less

答案2

参数 -CAfile 的值应该是你的 Let's encrypt 的 chain.pem 和 -cert cert.pem 的值:

openssl s_client -CAfile /etc/ssl/letsencrypt/chain.pem -verify 4 \
        -connect mailserver.dom.tld:25 -starttls smtp \
        -cert /etc/ssl/letsencrypt/cert.pem \
        -key /etc/ssl/letsencrypt/privkey.pem

这样,您的证书将由您的服务器验证。

相关内容