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

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

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

我试图在2个环境中运行我的应用程序:

  • 我的本地机器Windows 10与.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 = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12

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

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

为什么ServicePointManager.SecurityProtocol的默认值不同? 是因为.NET Framework配置? 或者可能是注册表设置 我搜遍了它但找不到答案。

MSDN:ServicePointManager.SecurityProtocol属性 :

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

MSDN博客:在Windows上支持SSL / TLS协议 :

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

MSDN:TLS / SSL中的密码套件(Schannel SSP)

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

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

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

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

我试过了,我的机器中ServicePointManager.SecurityProtocol的值从“Ssl3,Tls”变为“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