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