我的 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
这样,您的证书将由您的服务器验证。