目前我有一个问题,无法找到严格的答案。
我有针对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配置?或者可能是注册表设置我搜遍了它但找不到答案。
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