本文提供有关在 SQL Server 中升级到 TLS 1.2 后可能会遇到的安全套接字层 (SSL) 错误的信息。 它还列出了可以手动检索数据的方法。 还可以运行 SQLCHECK 工具并查看 SQLCHECK 日志文件中的信息。
现象
请考虑以下方案,在将 TLS 协议升级到 TLS 1.2 后,可能会出现以下问题。
Microsoft SQL Server 使用由弱哈希算法签名的证书。 此类证书包括 MD5、SHA224 和 SHA512。
TLS 1.2 升级仅应用于客户端或服务器,但不适用于这两者。
TLS 1.0 已禁用。
客户端和服务器之间没有匹配的加密算法。
在此方案中,升级完成后遇到以下问题:
影响服务器证书的问题也会影响客户端计算机的本地连接和连接。 有关详细信息,请参阅 加密与 SQL Server 的连接。
应用程序可能会生成以下错误消息之一:
命名管道
已成功与服务器建立连接,但在登录过程中发生错误。 (提供程序:SSL 提供程序,错误:0 - 管道的另一端没有进程)Microsoft SQL Server,错误:233。
TCP
已成功与服务器建立连接,但在登录过程中发生错误。 (提供程序:SSL 提供程序,错误:0 - 远程主机 10054 强行关闭连接)Microsoft SQL Server,错误:233。
如果有网络捕获,则可能类似于以下屏幕截图,显示服务器通过关闭连接来响应 Client Hello
数据包。
解决方法
若要解决这些错误,请执行以下步骤:
打开SQL Server 配置管理器,右键单击 InstanceName> 的<协议,然后选择“属性”。
选择“ 证书 ”选项卡,并检查正在使用的证书。
如果证书存在,请选择 “视图 ”以检查它,然后选择“ 清除”。 然后,转到步骤 4。
如果不存在证书,请检查 SQL Server 错误日志文件以获取哈希代码。 你可能会看到以下条目之一:
2023-05-30 14:59:30.89 spid15s The certificate [Cert Hash(sha1) "B3029394BB92AA8EDA0B8E37BAD09345B4992E3D"] was successfully loaded for encryption.
或2023-05-19 04:58:56.42 spid11s A self-generated certificate was successfully loaded for encryption.
如果证书是自生成的,请跳到步骤 2。
在 Microsoft管理控制台(MMC)中打开计算机证书存储 。
导航到 个人证书。
展开“预期用途”列,然后双击为服务器身份验证启用的证书。
检查指纹是否与错误日志文件中的指纹匹配。 如果没有,请尝试其他证书。
检查签名哈希算法。 如果它是 MD5、SHA224 或 SHA512,则它不支持 TLS 1.2。 如果它是弱算法之一,请禁用 服务器身份验证 ,以便 SQL Server 无法使用它。
如果在SQL Server 配置管理器中显式指定了证书,请选择“清除”将其删除。
在 MMC 中找到证书。
在 MMC 中,右键单击证书,然后选择“ 属性”。
在 “常规 ”选项卡上,完全禁用证书或有选择地禁用 服务器身份验证。
保存更改。
请重新启动 SQL Server。
错误日志现在应指示使用自生成证书。 如果问题得到解决,SQL Server 可以使用自签名证书成功运行。 如果需要 Verisign 或其他证书,则必须要求证书提供程序确保使用适用于 TLS 1.2 的强哈希。 如果未解决问题,请返回到步骤 2。
检查已启用和禁用的 TLS 协议
若要检查已启用和禁用的 TLS 协议,请执行以下步骤:
如果尚未执行此操作,请检查后台和基本升级工作流。
必须升级客户端和服务器才能强制实施 TLS 1.2。 如有必要,可以升级服务器,但保持 TLS 1.0 已启用,以便非升级的客户端可以连接。
使用 REGEDIT 检查 SSL 或 TLS 注册表。
可以在以下注册表子项下找到已启用和禁用的 SSL 或 TLS 版本:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
每个版本的 SSL 或 TLS 都有客户端和服务器子项,同时具有 “已启用” 和 “禁用” 值:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001
注意
任何非零值都被视为 TRUE。 但是, 通常首选 1 而不是 FFFFFFFF (或 -1)。
确保没有不兼容的设置。
例如,禁用 TLS 1.0 并在服务器上启用 TLS 1.2。 这是因为这些设置可能与客户端上的设置不匹配,或者客户端驱动程序可能不会更新。
可以通过设置
Enabled=0
TLS 1.2(如果禁用 TLS 1.0)来测试这种情况。重启 SQL Server 以检查问题是否与 TLS 1.2 相关,还是常规问题。
没有匹配的密码套件
可以检查客户端和服务器 TLS 版本以及数据包中的Client Hello
Server Hello
密码套件。 数据包 Client Hello
播发所有客户端密码套件,数据包 Server Hello
指定一个密码套件。 如果没有匹配的套件,服务器会关闭连接,而不是通过发送数据包做出 Server Hello
响应。
如果网络跟踪不可用,可以在以下注册表子项下检查函数值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002
如果看不到匹配算法,请联系Microsoft 支持部门。 为了协助支持工程师,请根据高级 SSL 数据捕获中指定的捕获网络跟踪或 BID 跟踪。