Windows 7以及.NET的TLS兼容性设置
编辑起因
2016年的时候使用易语言写了一个能调用热敏纸打印机远程打印api的工具,由于年久失修,在未知原因的情况下就不能使用了。在2022年的时候由于好多用户还想继续使用,就用C# .NET重写了一个,但在2024年又突然出现无法发送请求的故障,报错提示连接被远程服务器关闭。
探索
经过调查,发现是对方的api服务禁用了SSL2、SSL3、TLS1.0、TLS1.1这些协议,只保留了TLS1.2、TLS1.3,由于Win7默认禁用TLS1.1、TLS1.2协议,导致程序无法建立https安全连接。
未修改代码重新编译了程序,发现在Win10及Win11已经能够直接发送请求不会报错,但在Win7系统仍然无法运行。经过查阅微软官方文档发现,Win7在更新相关补丁后拥有对TLS1.1/TLS1.2的支持,但默认禁用了,兼容性参见下表(微软文档链接)。
注意:Windows 7系列系统必须更新KB3140245补丁才能拥有对TLS1.1/TLS1.2的支持。
实践
问题1
如果是已经无人维护的.NET应用,没有人对其进行更新,我们能否通过其他方式解决?
查阅微软文档,发现我们可以通过配置注册表的SchUseStrongCrypto
值来启用强加密(强制使用TLS 1.2和TLS 1.1)。
要启用这一项注册表设置,我们需要执行以下注册表命令:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727" /v "SchUseStrongCrypto" /t REG_DWORD /d 1 /f >nul
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" /v "SchUseStrongCrypto" /t REG_DWORD /d 1 /f >nul
对于64位的操作系统,还应执行以下注册表命令:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727" /v "SchUseStrongCrypto" /t REG_DWORD /d 1 /f >nul
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" /v "SchUseStrongCrypto" /t REG_DWORD /d 1 /f >nul
执行上述注册表命令后,在Windows 10及Windows 11系统上进行测试,发现旧版本无法发送请求的程序已经恢复正常工作,但在Windows 7系统上问题依旧,仍然提示连接被远程服务器关闭。
问题2
查阅微软文档,发现在Windows 7系列系统上,默认禁用TLS 1.1/TLS 1.2协议,我们仍然需要在Windows注册表中配置Schannel协议才能启用。有关详细信息,参阅TLS 注册表设置 - Schannel。
要启用Schannel协议的TLS1.1、TLS1.2并禁用SSL2.0,我们需要执行以下注册表命令:
::禁用SSL2.0
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client" /v "DisabledByDefault" /t REG_DWORD /d 0 /f >nul
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client" /v "Enabled" /t REG_DWORD /d 0 /f >nul
::启用TLS1.2
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v "DisabledByDefault" /t REG_DWORD /d 0 /f >nul
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v "Enabled" /t REG_DWORD /d 1 /f >nul
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v "DisabledByDefault" /t REG_DWORD /d 0 /f >nul
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v "Enabled" /t REG_DWORD /d 1 /f >nul
::启用TLS1.1
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client" /v "DisabledByDefault" /t REG_DWORD /d 0 /f >nul
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client" /v "Enabled" /t REG_DWORD /d 1 /f >nul
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v "DisabledByDefault" /t REG_DWORD /d 0 /f >nul
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v "Enabled" /t REG_DWORD /d 1 /f >nul
注意:无需在Windows 8及以上的系统执行这些命令,仅需运行在Windows Server 2008 with Service Pack 2 (SP2)、Windows 7/Windows Server 2008 R2。
执行上述注册表命令后,之前请求报错的软件已经可以正常运行了。
整合
既然我们已经知道问题的所在,就可以整合一个批处理文件用于相关问题的解决了。批处理文件的制作过程不在赘述,下面是批处理文件的下载dotNetTLSEnable_1740211867264.bat
- 1
- 0
-
分享