首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.NET 4.5中的默认SecurityProtocol

.NET 4.5中的默认SecurityProtocol
EN

Stack Overflow用户
提问于 2015-02-03 04:24:09
回答 17查看 378K关注 0票数 296

与最多支持TLS 1.2的服务器通信的默认安全协议是什么?默认情况下,.NET会选择服务器端支持的最高安全性协议,还是必须显式添加下面这行代码:

代码语言:javascript
复制
System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

除了代码更改之外,还有什么方法可以更改这个默认值吗?

最后,.NET 4.0只支持TLS 1.0吗?也就是说,我必须将客户端项目升级到4.5版本才能支持TLS 1.2

我的动机是删除客户端对SSLv3的支持,即使服务器支持它(我已经在机器注册表中有一个powershell脚本来禁用它),并支持服务器支持的最高TLS协议。

更新:查看.NET 4.0中的ServicePointManager类时,我没有看到TLS 1.01.1的枚举值。在这两个.NET 4.0/4.5中,默认值都是SecurityProtocolType.Tls|SecurityProtocolType.Ssl3。希望这个默认值不会因为在注册表中禁用SSLv3而被破坏。

然而,我已经决定将所有应用程序升级到.NET 4.5,并显式地将SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;添加到所有应用程序的所有引导代码中。

这将向各种apis和服务发出出站请求,使其不要降级到SSLv3,并且应该选择最高级别的TLS

这种方法听起来合理还是过头了?我有许多应用程序要更新,我想证明它们的未来,因为我听说甚至TLS 1.0可能会在不久的将来被一些供应商弃用。

作为向API发出出站请求的客户端,在注册表中禁用SSL3对.NET框架有影响吗?我看到默认情况下,TLS 1.1和1.2没有启用,我们必须通过注册表启用它吗?RE http://support.microsoft.com/kb/245030

经过一些调查,我相信注册表设置不会有任何影响,因为它们适用于IIS (服务器子项)和浏览器(客户端子项)。

很抱歉,这篇文章变成了多个问题,后面跟着“可能”的答案。

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2016-04-06 22:51:31

一些在其他答案上留下评论的人指出,将System.Net.ServicePointManager.SecurityProtocol设置为特定值意味着你的应用程序将无法利用未来的TLS版本,这些版本可能会成为.NET的未来更新的默认值。

对于.NET 4.7或更高版本,请勿设置System.Net.ServicePointManager.SecurityProtocol。默认值(SecurityProtocolType.SystemDefault)将允许操作系统使用它已知并已配置的任何版本,包括在创建应用程序时可能不存在的任何新版本。

对于早期版本的.NET框架,您可以打开或关闭您已知和关心的协议,而让其他协议保持原样。

要在不影响其他协议的情况下启用TLS 1.1和1.2,请执行以下操作:

代码语言:javascript
复制
System.Net.ServicePointManager.SecurityProtocol |= 
    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

请注意,使用|=打开这些标志,而不关闭其他标志。

要在不影响其他协议的情况下关闭SSL3:

代码语言:javascript
复制
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
票数 337
EN

Stack Overflow用户

发布于 2015-02-05 07:11:57

两个.NET 4.0/4.5中的默认System.Net.ServicePointManager.SecurityProtocol都是SecurityProtocolType.Tls|SecurityProtocolType.Ssl3

.NET 4.0最多支持TLS 1.0,而.NET 4.5最多支持TLS 1.2

但是,如果在同一环境中安装了.NET 4.0,则以.NET 4.5为目标的应用程序仍然可以支持高达TLS 1.2.NET 4.5安装在.NET 4.0之上,取代了System.dll

我已经通过观察fiddler4流量中设置的正确安全协议和在.NET 4.0项目中手动设置枚举值来验证这一点:

代码语言:javascript
复制
ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;

参考资料:

代码语言:javascript
复制
namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

如果你在只安装了.NET 4.0的环境中尝试黑客攻击,你会得到一个异常:

未处理的异常: System.NotSupportedException:不支持请求的安全协议。在System.Net.ServicePointManager.set_SecurityProtocol(SecurityProtocolType值中)

但是,我不推荐这种“黑客攻击”,因为将来的补丁等可能会破坏它。*

因此,我决定移除对SSLv3的支持的最好方法是:

  1. 将所有应用程序升级到.NET 4.5
  2. Add以下引导代码以覆盖默认设置,并在将来验证它:

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

*如果这个hack是错误的,有人纠正我,但初步测试我认为它是有效的

票数 198
EN

Stack Overflow用户

发布于 2015-02-13 23:09:02

您可以覆盖以下注册表中的默认行为:

代码语言:javascript
复制
Key  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

代码语言:javascript
复制
Key  : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

详情请参考implementation of ServicePointManager

票数 74
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28286086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档