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

时间:2018-05-04 08:53:30

标签: .net ssl

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

1 个答案:

答案 0 :(得分:1)

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

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

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