我的 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
...从服务器到自身使用与服务器使用相同的密钥,包括按正确顺序的中间证书不会给出有效的检查结果。
我错过了什么?
如果您的服务器使用默认配置,它应该使用
snakeoil
自签名证书。这对于在传出和传入连接上建立 TLS 连接是足够且可接受的。但是,它将无法通过验证。您将需要使用来自受信任机构的证书才能通过验证。您是否为客户提供了可以用来代替登录的证书?除了为您的用户提供用户证书外,我希望客户端证书经常失败。许多服务器使用自签名证书,或者存在其他会导致验证失败的问题。
tls_verify_hosts
除非您设置或,否则 Exim 不会要求提供客户端证书tls_try_verify_hosts
。Exim 文档的加密 SMTP 连接部分 很好地介绍了证书。许多组织无法正确配置其 DNS 以使用 STMP。DKIM 特别麻烦,我遇到的大多数签名者都无法通过验证。我不太希望许多站点已经使用正确的有效证书配置了他们的服务器。
在最近限制连接到 TLS v1.0 及更高版本之后,我不得不停止
STARTTLS
向许多服务器发布消息。我还没有尝试为任何客户端验证 TLS 证书。如果我这样做了,它最多会计入他们的垃圾邮件分数。我可以启用tls_peerdn
日志选择器来调查是否有任何站点可以通过验证。基于 TLS 的 SMTP 正在增长,但远未达到标准。那些确实使用它的站点是通过其他方式受到良好信任的站点。
更新:我检查了我的日志,到目前为止只有两个发件人通过了验证。大多数客户没有验证。
我尝试验证我的证书:
openssl.client.net
不应该通过 rDNS 验证。我使用的测试命令是:
参数 -CAfile 的值应该是您的 Let's encrypt 的 chain.pem 和 -cert cert.pem 的值:
像这样,您的证书将由您的服务器验证。