关于ssl:.NET 4.5的TLS握手协议

TLS Handshake Protocol for .NET 4.5

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

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

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

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


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

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

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