与最高支持 TLS 1.2
的服务器通信的默认安全协议(protocol)是什么?默认情况下,.NET
会选择服务器端支持的最高安全协议(protocol),还是我必须显式添加这行代码:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
除了代码更改之外,是否还有其他方法可以更改此默认值?
最后,.NET 4.0
是否只支持到 TLS 1.0
?即我必须将客户端项目升级到 4.5 以支持 TLS 1.2
。
我的动机是在客户端删除对 SSLv3
的支持,即使服务器支持它(我已经有一个 powershell 脚本来在机器注册表中禁用它)并支持最高的 TLS 协议(protocol)服务器支持。
更新:
查看 .NET 4.0
中的 ServicePointManager
类,我没有看到 TLS 1.0
和 1.1
的枚举值。在 .NET 4.0/4.5
中,默认值为 SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
。希望在注册表中禁用 SSLv3
不会破坏此默认设置。
但是,我决定必须将所有应用程序升级到 .NET 4.5
并显式添加 SecurityProtocolType.Tls |安全协议(protocol)类型.Tls11 | SecurityProtocolType.Tls12;
所有应用程序的所有引导代码。
这将向各种 api 和服务发出出站请求,以不降级到 SSLv3
并且应该选择最高级别的 TLS
。
这种方法听起来合理还是矫枉过正?我有很多应用程序要更新,我想在未来证明它们,因为我听说甚至 TLS 1.0
可能在不久的将来被一些供应商弃用。
作为向 API 发出出站请求的客户端,在注册表中禁用 SSL3 是否会对 .NET 框架产生影响?我看到默认情况下未启用 TLS 1.1 和 1.2,我们是否必须通过注册表启用它?回复 http://support.microsoft.com/kb/245030 .
经过一些调查,我相信注册表设置不会有任何影响,因为它们适用于 IIS(服务器子项)和浏览器(客户端子项)。
抱歉,这篇文章变成了多个问题,然后是“可能”的答案。
最佳答案
一些对其他答案发表评论的人指出,将 System.Net.ServicePointManager.SecurityProtocol
设置为特定值意味着您的应用将无法利用 future 的 TLS 版本可能会成为 .NET future 更新中的默认值。不要指定固定的协议(protocol)列表,而是执行以下操作:
对于 .NET 4.7 或更高版本,不要设置 System.Net.ServicePointManager.SecurityProtocol
。默认值 (SecurityProtocolType.SystemDefault
) 将允许操作系统使用它知道并已配置的任何版本,包括在创建应用程序时可能不存在的任何新版本。
对于较早版本的 .NET Framework,您可以改为打开或关闭您知道和关心的协议(protocol),让其他任何协议(protocol)保持原样。
在不影响其他协议(protocol)的情况下开启 TLS 1.1 和 1.2:
System.Net.ServicePointManager.SecurityProtocol |=
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
注意使用 |=
来打开这些标志而不关闭其他标志。
在不影响其他协议(protocol)的情况下关闭 SSL3:
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
关于.net - .NET 4.5 中的默认安全协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28286086/