适用于 .NET 4.5 的 TLS 握手协议



我正在使用一个.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 握手?

SecurityProtocolType是用FlagsAttribute标记的枚举。 简而言之,这允许使用二进制|(或)运算符将其值组合为一个值。 你可以在这里看到一些从数学角度来看FlagsAttribute如何工作的例子。

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

.NET 中的ServicePointManager类实际上并不直接控制协议协商,只是指定它将允许的版本。 它实际上只是Windows上"schannel.dll"的包装器,这是一个使用p/Invoke的本机库.NET调用。

最新更新