簡體   English   中英

如何在特定的HttpWebRequest中使用SSL3而不是TLS?

[英]How to use SSL3 instead of TLS in a particular HttpWebRequest?

我的應用程序必須通過https與不同的主機通信,並且ServicePointManager.SecurityProtocol = TLS的默認設置為我提供了很好的幫助。 現在我有一些主機(如System.Net跟蹤日志所示)不回答初始TLS握手消息,但保持底層連接打開直到超時,拋出超時異常。 我嘗試將HttpWebRequest的超時設置為5分鍾,結果相同。 據推測,這些主機正在等待SSL3握手,因為IE和Firefox都可以在30-40秒的延遲后連接到這些主機。 在.NET中似乎有一些回退機制將TLS降級為SSL3,但由於某些原因它沒有啟動。

FWIW,這是我的請求發送的握手消息(常規TLS 1.0 CLIENT HELLO消息):

00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9..
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l.
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./
00000030 : 00 35 00 05 00 0A C0 09-C0 0A C0 13 C0 14 00 32 : .5.............2
00000040 : 00 38 00 13 00 04 01 00-00 12 00 0A 00 08 00 06 : .8..............
00000050 : 00 17 00 18 00 19 00 0B-00 02 01 00             : ............    

有沒有辦法在特定的HttpWebRequest使用SSL3而不是TLS,還是強制回退? 似乎ServicePointManager的設置是全局的,我真的不願意為整個應用程序將安全協議設置降級為SSL3。

實際上, ServicePointManager設置是每個appdomain。 這使我能夠通過創建一個單獨的appdomain設置為僅使用SSL3來解決這個問題,使我的數據集合對象MarshalByRefObjectWebClientWebRequest都是按編組編組,但最好減少跨appdomain調用的數量)並在那里創造它。 完美結合基於超時的檢測方案。

.NET包含自動協商到協議的較低版本的規定。 ServicePointManager.SecurityProtocol的值確定行為。 它可以采用3個不同的值: SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls 雖然是全球性的,但可以根據需要進行更改。

如果沒有訪問具有相同錯誤行為的服務器,我無法確定解決方案。 關於我能做的唯一建議是嘗試連接Ssl3 | Tls Ssl3 | Tls設置,如果不起作用,則使用Ssl3設置重試。 嘗試降低超時並捕獲超時異常,然后重試。

編輯

我在上一個版本中寫的大部分內容都是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM