我在 Ubuntu 22.04 的主機上安裝了 ansible,我嘗試使用 winrm 連接到 Windows Server 2012 R2 的主機。問題是我收到連線錯誤。
經過幾個小時的追尋錯誤,我找到了原因:
- 使用SSL掃描(使用
--show-sigs
選項)我發現Windows主機只接受rsa_pkcs1-sha1
伺服器簽章演算法(據我調查,我了解到該演算法是在金鑰交換期間使用的,與與憑證相關的簽章演算法無關)。我很想說這是 Windows Server 2012 R2 的正常行為,但我不是 Windows 專家,無法確定這一點。 - Ubuntu 22.04 附帶了預設配置為 seclevel 2 的 openssl 3.0.2。這意味著,在與 Windows 主機進行 TLS 握手期間,openssl 永遠不會將該
rsa_pkcs1-sha1
演算法作為 Client Hello 的簽章演算法清單中支援的演算法呈現(我透過 Wireshark 確認了這一點)。 - 由於 Windows Server 2012 R2 主機只能理解
rsa_pkcs1-sha1
,但它沒有出現在 Client Hello 中,因此主機唯一能做的就是終止連接,並在事件檢視器中留下以下訊息:從遠端用戶端應用程式收到 TLS 1.2 連線請求,但伺服器不支援用戶端應用程式支援的密碼套件。請注意,該訊息有點誤導,因為密碼套件根本沒有問題。問題在於金鑰交換的簽章演算法。
有了這些信息,我決定將 openssl 的 seclevel 從 2 降級為 0。我能夠使用openssl s_client
命令和 Wireshark 確認此變更允許 openssl 連接到 Windows 主機,因為在 seclevel 0 處,openssl 實際上包含rsa_pkcs1-sha1
Client Hello 的簽章演算法清單中的演算法。
現在的問題是,即使/etc/ssl/openssl.cnf
設定為 seclevel 0,ansible 仍然無法連接到 windows 主機。我的猜測是,ansible 使用了 openssl 的一些 python 包裝器,/etc/ssl/openssl.cnf
完全繞過了設定檔。所以問題是:如何強迫 ansible (或 python)在 seclevel 0 處使用 openssl?