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

标签 .net httpwebrequest ssl

我的应用程序必须通过 https 与不同的主机通信,而 ServicePointManager.SecurityProtocol = TLS 的默认设置直到今天都为我提供了很好的服务。现在我有一些主机(如 System.Net 跟踪日志所示)不响应初始 TLS 握手消息,但保持底层连接打开直到超时,抛出超时异常。我尝试将 HttpWebRequest 的超时设置为 5 分钟,结果相同。推测这些主机正在等待 SSL3 握手,因为 IE 和 Firefox 都能够在 30-40 秒的延迟后连接到这些主机。 .NET 中似乎有一些后备机制将 TLS 降级为 SSL3,但由于某种原因它没有启动。

FWIW,这是我的请求发送的握手消息(常规 TLS 1.0 客户端问候消息):

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 的设置似乎是全局的,我真的很讨厌必须将整个应用程序的安全协议(protocol)设置降级为 SSL3。

最佳答案

实际上,ServicePointManager 设置是针对每个应用域的。这使我能够通过创建一个单独的应用程序域来解决这个问题,该应用程序域设置为仅使用 SSL3,使我的数据收集对象 MarshalByRefObject(WebClientWebRequest 是 marshal-by-ref,但最好减少跨应用程序域调用的次数)并在那里创建它。与基于超时的检测方案完美结合。

关于.net - 如何在特定的 HttpWebRequest 中使用 SSL3 而不是 TLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028486/

相关文章:

c# - 反转队列

c# - 您是否需要后台 worker 或多个线程来触发多个异步 HttpWebRequest?

java - 如何通过 ssl 发送请求?

c# - Quickfixn SSL 配置问题

c# - 是否可以将相同的 DLL 放入控制台应用程序和 NuGet 依赖项中?

c# - DateTime.Compare 方法不适用于不同的语言

.net - SQL Server 停止加载程序集

C# HttpWebRequest 底层连接被关闭 : An unexpected error occurred on a send

c# - 如何在 C# 中正确发送 KeepAlive header ?

reactjs - 创建 React App - 无法获取本地颁发者证书