信任已在另一台主機上信任的 x509 證書
我有兩台主機,一台使用 Debian Buster,一台使用 CentOS 7。
我想從他們兩個通過 SSL 連接到 SMTP 伺服器。但是,我只能在 CentOS 上這樣做:
中央作業系統:
$ openssl s_client -connect smtp.server.com:587 CONNECTED(00000003) depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3 verify return:1 depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 verify return:1 depth=0 CN = server.com verify return:1 --- Certificate chain 0 s:/CN=server.com i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- ...
德比安:
$ openssl s_client -connect smtp.server.com:587 CONNECTED(00000003) depth=0 CN = server.com verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = server.com verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:CN = server.com i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 ---
問題似乎在於 Debian 主機缺少 Let’s Encrypt 證書或不信任它。
如何將信任從一台機器“轉移”到另一台機器?即我如何確保他們都信任相同的證書?
安裝 CA 證書包
首先,您需要確認您的 Debian 機器上是否安裝了 Root CA 證書包。
跑:
$ apt list --installed 2>/dev/null | grep ca-certificates
如果輸出
[installed]
在該行的末尾,那麼它已安裝,但包缺少根 CA 證書 - 跳轉到下一部分。如果該命令沒有輸出任何內容,那麼您需要使用以下命令安裝 CA 證書:
$ sudo apt install ca-certificates
此時,再次測試您的命令。
如果仍然失敗,則需要手動添加 Root CA 證書,如下所示:
將根 CA 證書添加到信任錨儲存
如果您閱讀此處,您會看到正確的 Root 是Let’s Encrypt 的 ISRG Root X1。Let’s Encrypt 發行 CA ( Let’s Encrypt Authority X3 ) 已由上述簽名,並且已由 Identrust 的 Root CA 交叉簽名,以提高與舊系統的兼容性。這是您的 CentOS 機器使用的後者,但明年到期,因此不值得在您的 Debian 機器中安裝。
要讓您的 Debian 機器正常工作,請從上面的連結下載Let’s Encrypt ISRG Root X1
ISRG_Root_X1.pem
並將其保存到您的 Debian 系統中(例如)/usr/local/share/ca-certificates/
在繼續下一步之前,請確保您確認我提供的連結是真實的(Let’s Encrypt 站點)和安全的 (HTTPS),而不是我試圖讓您安裝偽造的根 CA 證書。
現在執行:
$sudo update-ca-certificates
將新證書添加到您的信任庫。
如果你真的想使用 Identrust Root CA 證書,你可以從這裡下載。這是頁面上的最後一個連結。
再次嘗試您的命令,希望它可以工作。
錯誤配置的 SMTP 伺服器
如果仍然失敗,您需要檢查 SMTP 伺服器是否正在發送證書鏈作為 TLS 握手的一部分。很多時候,伺服器管理員只配置最終實體證書並省略 CA 鏈。添加
-showcerts
到 Debian 框上的命令並檢查是否顯示了所有證書(以 PEM 格式)。如果它們失去,請與伺服器管理員交談並要求他們(很好地)正確配置他們的伺服器。