为什么ServicePointManager.不同机器上的SecurityProtocol默认值不同
本文关键字:SecurityProtocol 默认值 机器 ServicePointManager 为什么 | 更新日期: 2023-09-27 18:04:58
目前我有一个问题,不能找到严格的答案。
我有ASP。. NET MVC 5应用程序瞄准4.6.1框架,其目标是与由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框架配置吗?或者注册表设置?
MSDN: ServicePointManager。SecurityProtocol属性:
注意,故意没有列出此属性的默认值。安全环境不断变化,默认协议和保护级别随着时间的推移而变化,以避免已知的弱点。默认值将根据各个机器的配置、安装的软件和应用的补丁而变化。
MSDN博客:支持Windows上的SSL/TLS协议:
在Windows上,对SSL/TLS协议的支持与SCHANNEL组件绑定。因此,如果一个特定的操作系统版本不支持SSL/TLS版本,这意味着它仍然不受支持。
MSDN: TLS/SSL(通道SSP)中的密码套件
不同的Windows版本支持不同的TLS密码套件和优先顺序。请参阅相应的Windows版本,以了解Microsoft channel Provider选择它们的默认顺序。
换句话说:这是由您的Windows版本及其补丁级别决定的。
但是就像@Damien说的,你为什么要麻烦默认级别是什么?
我们可以像下面这样更新注册表,让。net框架使用TLS1.1'TLS1.2,需要重新启动。
我试过了,ServicePointManager的值。我的机器中的安全协议从"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