我的应用程序需要通过https与不同的主机通信,而默认设置的
FWIW,以下是我的请求发送的握手消息(一个常规的TLS 1.0 CLIENT HELLO消息):
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。