代码之家  ›  专栏  ›  技术社区  ›  Anton Tykhyy

如何在特定的httpwebrequest中使用ssl3而不是tls?

  •  9
  • Anton Tykhyy  · 技术社区  · 14 年前

    我的应用程序必须通过https与不同的主机对话,默认设置为 ServicePointManager.SecurityProtocol = TLS 直到今天我都很好。现在我有一些主人 System.Net 跟踪日志显示)不要回答最初的TLS握手消息,而是保持底层连接打开直到超时,引发超时异常。我尝试设置 HttpWebRequest 的超时时间高达5分钟,结果相同。假设这些主机正在等待SSL3握手,因为IE和火狐都能够在30-40秒的延迟后连接到这些主机。.NET中似乎有一些回退机制将TLS降级为SSL3,但由于某种原因,它没有启动。

    fwiw,这是我请求发送的握手消息(常规的tls 1.0客户机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             : ............    
    

    在特定情况下,是否有方法使用ssl3而不是tls? HTTPWebRebug 或强制回退?似乎 ServicePointManager 的设置是全局的,我真的不想将整个应用程序的安全协议设置降级为SSL3。

    2 回复  |  直到 14 年前
        1
  •  13
  •   Anton Tykhyy    14 年前

    事实上, ServicePointManager 设置为每个AppDomain。这使我能够通过创建一个单独的AppDomain来解决这个问题,设置为仅使用SSL3,使我的数据收集对象 MarshalByRefObject (两者) WebClient WebRequest 是按引用封送的,但最好减少跨AppDomain调用的数量)并在那里创建它。与基于超时的检测方案完美结合。

        2
  •  4
  •   President James K. Polk    14 年前

    .NET包含自动协商低版本协议的条款。价值 ServicePointManager.SecurityProtocol 确定行为。它可以有3个不同的值: SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls . 虽然是全球性的,但可以根据需要进行更改。

    如果没有访问具有相同错误行为的服务器,我就无法识别解决方案。我唯一能提出的建议是尝试与 Ssl3 | Tls 设置,如果不起作用,请使用 Ssl3 设置。尝试降低超时并捕获超时异常,然后重试。

    编辑

    我在以前版本的答案中写的大部分都是错误的。