【问题标题】:TLS Handshake Protocol for .NET 4.5.NET 4.5 的 TLS 握手协议
【发布时间】:2018-10-14 16:58:14
【问题描述】:

我正在使用 .NET 应用程序(客户端)向服务器发出 https 调用。我的应用程序基于 .NET 4.5,因此使用的默认 TLS 协议是 TLS 1.0。为了支持所有类型的协议,我已将其包含在我的代码中:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;

现在对于任何服务器配置都可以正常工作。

但我不确定这部分代码的作用是什么?它会尝试所有三个并回退到兼容版本吗?如果是,它会以什么协议版本顺序尝试创建 TLS 握手?

【问题讨论】:

    标签: .net ssl


    【解决方案1】:

    SecurityProtocolType 是一个用FlagsAttribute 标记的枚举。简而言之,这允许使用二进制|(或)运算符将其值组合成一个值。您可以从数学角度查看FlagsAttribute 的一些示例here。

    本质上,这行代码告诉ServicePointManager 它被允许使用枚举中列出的 TLS 版本之一。它被记录为使用连接双方支持的最高列出的版本(不包括攻击者可以用来弄乱握手的一些技巧,记录在下面链接的 RFC 中)。如果您真的想了解它如何协商使用哪个版本,您可以阅读RFC 5246(针对 TLS 1.2),特别是Section 7.3。

    .NET 中的ServicePointManager 类实际上并不直接控制协议协商,除了指定它允许的版本。它实际上只是一个围绕“schannel.dll”的wrapper,在 Windows 上,这是一个使用 p/Invoke 调用的本机库 .NET。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2015-04-01
      • 2021-11-14
      相关资源
      最近更新 更多