升级到 TLS 1.2 后报告 SSL 错误

本文提供有关在 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 数据包。

网络捕获的屏幕截图,其中显示了服务器如何响应客户端 Hello 数据包。

解决方法

若要解决这些错误,请执行以下步骤:

  1. 打开SQL Server 配置管理器,右键单击 InstanceName> 的<协议,然后选择“属性”。

  2. 选择“ 证书 ”选项卡,并检查正在使用的证书。

    “证书”选项卡的屏幕截图,其中显示了使用哪个证书。

    • 如果证书存在,请选择 “视图 ”以检查它,然后选择“ 清除”。 然后,转到步骤 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。

  3. Microsoft管理控制台(MMC)中打开计算机证书存储

    1. 导航到 个人证书

    2. 展开“预期用途”列,然后双击为服务器身份验证启用的证书。

    3. 检查指纹是否与错误日志文件中的指纹匹配。 如果没有,请尝试其他证书。

    4. 检查签名哈希算法。 如果它是 MD5、SHA224 或 SHA512,则它不支持 TLS 1.2。 如果它是弱算法之一,请禁用 服务器身份验证 ,以便 SQL Server 无法使用它。

    5. 如果在SQL Server 配置管理器中显式指定了证书,请选择“清除将其删除。

    6. 在 MMC 中找到证书。

    7. 在 MMC 中,右键单击证书,然后选择“ 属性”。

    8. “常规 ”选项卡上,完全禁用证书或有选择地禁用 服务器身份验证

      从SQL Server 配置管理器中选择“属性”。

  4. 保存更改。

  5. 请重新启动 SQL Server。

    错误日志现在应指示使用自生成证书。 如果问题得到解决,SQL Server 可以使用自签名证书成功运行。 如果需要 Verisign 或其他证书,则必须要求证书提供程序确保使用适用于 TLS 1.2 的强哈希。 如果未解决问题,请返回到步骤 2。

检查已启用和禁用的 TLS 协议

若要检查已启用和禁用的 TLS 协议,请执行以下步骤:

  1. 如果尚未执行此操作,请检查后台和基本升级工作流。

    必须升级客户端和服务器才能强制实施 TLS 1.2。 如有必要,可以升级服务器,但保持 TLS 1.0 已启用,以便非升级的客户端可以连接。

  2. 使用 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)。

  3. 确保没有不兼容的设置。

    例如,禁用 TLS 1.0 并在服务器上启用 TLS 1.2。 这是因为这些设置可能与客户端上的设置不匹配,或者客户端驱动程序可能不会更新。

    可以通过设置 Enabled=0 TLS 1.2(如果禁用 TLS 1.0)来测试这种情况。

  4. 重启 SQL Server 以检查问题是否与 TLS 1.2 相关,还是常规问题。

没有匹配的密码套件

可以检查客户端和服务器 TLS 版本以及数据包中的Client HelloServer Hello密码套件。 数据包 Client Hello 播发所有客户端密码套件,数据包 Server Hello 指定一个密码套件。 如果没有匹配的套件,服务器会关闭连接,而不是通过发送数据包做出 Server Hello 响应。

可以检查的密码套件详细信息的屏幕截图,以确定套件是否匹配。

如果网络跟踪不可用,可以在以下注册表子项下检查函数值:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002

如果看不到匹配算法,请联系Microsoft 支持部门。 为了协助支持工程师,请根据高级 SSL 数据捕获中指定的捕获网络跟踪或 BID 跟踪。