Debian

exim4 檢查客戶端證書總是無效

  • February 7, 2017

我的 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

…從伺服器到自身使用與伺服器使用相同的密鑰,包括按正確順序的中​​間證書不會給出有效的檢查結果。

我錯過了什麼?

參數 -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

像這樣,您的證書將由您的伺服器驗證。

如果您的伺服器使用預設配置,它應該使用snakeoil自簽名證書。這對於在傳出和傳入連接上建立 TLS 連接是足夠且可接受的。但是,它將無法通過驗證。您將需要使用來自受信任機構的證書才能通過驗證。

您是否為客戶提供了可以用來代替登錄的證書?除了為您的使用者提供使用者證書外,我希望客戶端證書經常失敗。許多伺服器使用自簽名證書,或者存在其他會導致驗證失敗的問題。

tls_verify_hosts除非您設置或,否則 Exim 不會要求提供客戶端證書tls_try_verify_hostsExim 文件的加密 SMTP 連接部分 很好地介紹了證書。

許多組織無法正確配置其 DNS 以使用 STMP。DKIM 特別麻煩,我遇到的大多數簽名者都無法通過驗證。我不太希望許多站點已經使用正確的有效證書配置了他們的伺服器。

在最近限制連接到 TLS v1.0 及更高版本之後,我不得不停止STARTTLS向許多伺服器發布消息。我還沒有嘗試為任何客戶端驗證 TLS 證書。如果我這樣做了,它最多會計入他們的垃圾郵件分數。我可以啟用tls_peerdn日誌選擇器來調查是否有任何站點可以通過驗證。

基於 TLS 的 SMTP 正在增長,但遠未達到標準。那些確實使用它的站點是通過其他方式受到良好信任的站點。

更新:我檢查了我的日誌,到目前為止只有兩個發件人通過了驗證。大多數客戶沒有驗證。

我嘗試驗證我的證書:

  • 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

引用自:https://serverfault.com/questions/787548