为什么ServicePointManager.SecurityProtocol在不同的机器上的默认值是不同的?

时间:2016-08-31 10:22:54

标签: c# .net asp.net-mvc ssl iis

目前我遇到了一个问题,无法找到严格的答案。

我有针对4.6.1框架的ASP.NET MVC 5应用程序,其目标是使用受TLS 1.1 / TLS 1.2协议保护的第三方API。

我试图在两种环境下运行我的应用程序:

  • 我的本地计算机Windows 10 with .NET 4.6.2 Framework,IIS Express;
  • 服务器计算机Windows Server 2012 with .NET 4.6.1,IIS 8.0;

问题在于,当我在本地启动ServicePointManager.SecurityProtocol时,默认值设置为Ssl3, Tls,因此我无法定位API并且必须在应用程序启动时对其进行编码使用TLS 1.1 / TLS 1.2:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12

当应用程序在服务器上运行时,默认值ServicePointManager.SecurityProtocol设置为Tls, Tls11, Tls12,因此效果很好。

根据文档,在.NET Framework 4.6或更高版本上运行的应用程序默认情况下必须使用TLS 1.1 / TLS 1.2,它是如何在远程计算机上运行的。

为什么ServicePointManager.SecurityProtocol的默认值不同?是因为.NET Framework配置?或者注册表设置?我已经搜索过但无法找到答案。

2 个答案:

答案 0 :(得分:10)

MSDN: ServicePointManager.SecurityProtocol Property

  

请注意,此属性没有列出默认值。安全格局不断变化,默认协议和保护级别会随着时间的推移而发生变化,以避免已知的弱点。默认值将根据各个计算机配置,安装的软件以及已应用的修补程序而有所不同。

MSDN Blogs: Support for SSL/TLS protocols on Windows

  

在Windows上,对SSL / TLS协议的支持与SCHANNEL组件相关联。因此,如果特定操作系统版本不支持SSL / TLS版本,则表示它仍然不受支持。

MSDN: Cipher Suites in TLS/SSL (Schannel SSP)

  

不同的Windows版本支持不同的TLS密码套件和优先级顺序。请参阅相应的Windows版本,了解Microsoft Schannel提供程序选择它们的默认顺序。

换句话说:这取决于您的Windows版本及其补丁级别。

但是像@Damien说的那样,为什么你会打扰默认级别呢?

答案 1 :(得分:7)

我们可以更新下面的注册表,让.Net框架使用TLS1.1 \ TLS1.2,需要重启。

我已经尝试了,我的机器中的ServicePointManager.SecurityProtocol的值已从" Ssl3,Tls" to" Tls,Tls11,Tls12":

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001