沉寂的博客

沉寂的博客

Windows 7以及.NET的TLS兼容性设置

78
2025-02-20

起因

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的支持。

Windows 操作系统

TLS 1.0 客户端

TLS 1.0 服务器

TLS 1.1 客户端

TLS 1.1 服务器

TLS 1.2 客户端

TLS 1.2 服务器

TLS 1.3 客户端

TLS 1.3 服务器

Windows Vista/Windows Server 2008

Windows Server 2008 with Service Pack 2 (SP2)

🚫

🚫

🚫

🚫

Windows 7/Windows Server 2008 R2

🚫

🚫

🚫

🚫

Windows 8/Windows Server 2012

Windows 8.1/Windows Server 2012 R2

Windows 10 版本 1507

Windows 10 版本 1511

Windows 10 版本 1607/Windows Server 2016 Standard

Windows 10 版本 1703

Windows 10 版本 1709

Windows 10 版本 1803

Windows 10,版本 1809/Windows Server 2019

Windows 10 版本 1903

Windows 10 版本 1909

Windows 10 版本 2004

Windows 10 版本 20H2

Windows 10,版本 21H1

Windows 10 版本 21H2

Windows 10 版本 22H2

Windows Server 2022

Windows 11 版本 21H2

Windows 11 版本 22H2

Windows 11 版本 23H2

Windows Server 2025

Windows 11,版本 24H2

实践

问题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