与最多支持TLS 1.2
的服务器通信的默认安全协议是什么?默认情况下,.NET
会选择服务器端支持的最高安全性协议,还是必须显式添加下面这行代码:
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.0
和1.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 (服务器子项)和浏览器(客户端子项)。
很抱歉,这篇文章变成了多个问题,后面跟着“可能”的答案。
发布于 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,请执行以下操作:
System.Net.ServicePointManager.SecurityProtocol |=
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
请注意,使用|=
打开这些标志,而不关闭其他标志。
要在不影响其他协议的情况下关闭SSL3:
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
发布于 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
项目中手动设置枚举值来验证这一点:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;
参考资料:
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
的支持的最好方法是:
.NET 4.5
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
*如果这个hack是错误的,有人纠正我,但初步测试我认为它是有效的
发布于 2015-02-13 23:09:02
您可以覆盖以下注册表中的默认行为:
Key : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1
和
Key : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1
https://stackoverflow.com/questions/28286086
复制相似问题