问题 为什么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 被设定为 Tls, Tls11, Tls12,所以效果很好。

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

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


2648
2017-08-31 10:22


起源

为什么重要的是什么 默认 价值是?如果你需要一些 具体 设置,无论如何设置它们似乎是最直接的事情。 - Damien_The_Unbeliever
@Damien_The_Unbeliever这很重要,因为当服务器撤销使用时 Ssl3 和 Tls 因为它们已经过时,正在进行调用的应用程序必须具备 Tls11 和 Tls12 在里面 ServicePointManager.SecurityProtocol 将较新的协议定义为可以使用的选项。您可以在代码中手动指定它们,但这显然不是一个好主意。为什么默认情况下不会使用最安全的版本?恕我直言,这应该发生在没有我们做任何事情的情况下...... - Randall Borck


答案:


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说的那样,为什么你会打扰默认级别呢?


8
2017-08-31 10:29



谢谢你们的回答。由于类似环境的这种差异,我有点困惑。我明确地设定了值 - Oleh Udovytskyi


我们可以更新下面的注册表让.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 

6
2018-06-09 21:24