2017-10-18 63 views
3

我試圖做HTTPS GET使用客戶端證書認證請求的響應創建SSL通道和它失敗.NET 4.7失敗時服務器TLS 1.1

The request was aborted: Could not create SSL/TLS secure channel. 

我試圖使用Java和相同的請求它工作正常,我看到的Java日誌以下(剝離只有趣的部分):

*** ClientHello, TLSv1.2 
main, WRITE: TLSv1.2 Handshake, length = 185 

.... 

*** ServerHello, TLSv1.1 
main, READ: TLSv1.1 Handshake, length = 3339 

這是我理解的手段,由於某種原因,該服務器不支持TLS 1.2,但客戶端接受這一點,只是秋天支持TLS 1.1。

當我設置

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; 

.NET正常工作了。 現在的問題 - 爲什麼.NET不像Java一樣回退到TLS 1.1,我可以以某種方式啓用該回退(不實際嘗試TLS 1.2,捕獲異常並嘗試使用TLS 1.1)?

+1

集SecurityProtocol到SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12? – Evk

+0

您在運行此代碼的機器上安裝的Windows版本是什麼? – Evk

+0

Windows 10 15063.608 – Giedrius

回答

2

ServicePointManager.SecurityProtocol說明中指出

注意,沒有默認值列出該屬性,故意的。 安全格局不斷變化,默認協議和 保護級別隨着時間的推移而變化,以避免已知的缺陷 。默認值將根據個人計算機的配置,以及安裝哪些軟件和哪些 補丁已應用而有所不同。

您的代碼不應該隱含地依賴於使用特定保護級別的 ,或者假定默認情況下使用給定的 安全級別。如果您的應用程序依賴於使用特定安全級別,則必須明確指定該級別並 ,然後檢查並確保它在已建立的 連接上實際使用。此外,您的代碼應該被設計爲在支持協議的變化中保持健壯,因爲這樣的變化通常是在幾乎沒有預先通知的情況下做出的,以便減輕新出現的 威脅。

雖然在.NET 4.7這個屬性的默認值應該是SystemDefaultsource)和SystemDefault意思是 「問OS有關的默認協議列表」(和Windows 10 TLS 1.1和TLS 1.2是enabled) - 此值仍然會受到多個外部源(如註冊表項的影響,正如您在上面所看到的,即使安裝了軟件或應用的修補程序)。正如我們在評論中發現的那樣,出於某種原因,您默認爲Ssl3 | Tls,這很糟糕,因爲Ssl3甚至不安全,應該禁用。

所以解決您的問題(並在將來這種情況下) - 你所需要的,特別是如果你發佈你在多個客戶機應用程序了總是名單的協議,因爲默認設置是不可靠的:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
+0

此外它看起來像在Windows 10與.net 4.7的相同問題在這裏提到:https://stackoverflow.com/questions/44751179/tls-1-2-not-negotiated-in-net-4-7-without -explicit-servicepointmanager-security/44765698#44765698 – Giedrius

+0

@Giedrius的確如此。但這似乎並不一致。例如,我具有與您相同的Windows版本,但在.NET 4.7上默認情況下爲SystemDefault – Evk

相關問題