远程主机强行关闭了现有连接 (OS 错误 10054)

适用于: SQL Server

注意

在开始故障排除之前,我们建议查看先决条件并核对清单。

本文详细介绍了各种方案,并提供了以下错误的解决方法:

  • 已成功与服务器建立连接,但是在登录过程中发生错误。 (提供程序:SSL 提供程序,错误:0 - 远程主机强行关闭了现有连接。)

  • 已成功与服务器建立连接,但在登录前握手期间发生了错误。 (提供程序:TCP 提供程序,错误:0 - 远程主机强行关闭了现有连接。)

Windows 套接字层中会引发操作系统错误 10054。 有关详细信息,请参阅 Windows 套接字错误代码:WSAECONNRESET 10054

何时看到错误?

安全通道(也称为 Schannel)是 SSP) (安全支持提供程序 。 它包含一组安全协议,这些协议通过加密提供标识身份验证和安全专用通信。 Schannel SSP 的一个功能是实现不同版本的 传输层安全性 (TLS) 协议。 此协议是一种行业标准,旨在保护通过 Internet 通信的信息的隐私。

TLS 握手协议负责在通过 TCP 通信的两个应用程序之间建立或恢复安全会话所需的密钥交换。 在连接过程的预登录阶段,SQL Server和客户端应用程序使用 TLS 协议建立用于传输凭据的安全通道。

以下方案详细说明了无法完成握手时发生的错误:

方案 1:客户端和服务器之间不存在匹配的 TLS 协议

安全套接字层 (SSL) 和 TLS 1.2 之前的 TLS 版本有多个已知漏洞。 建议升级到 TLS 1.2 并尽可能禁用早期版本。 因此,系统管理员可以通过组策略或其他机制推送更新,以在环境中的各种计算机上禁用这些不安全的 TLS 版本。

当应用程序使用早期版本的 Open Database Connectivity (ODBC) 驱动程序、OLE DB 提供程序、.NET framework 组件或不支持 TLS 1.2 的 SQL Server 版本时,会发生连接错误。 出现此问题的原因是服务器和客户端找不到匹配的协议 (,例如 TLS 1.0 或 TLS 1.1) 。 需要匹配协议才能完成继续连接所需的 TLS 握手。

解决方案

若要解决此问题,请使用以下某种方法:

  • 将SQL Server或客户端提供程序升级到支持 TLS 1.2 的版本。 有关详细信息,请参阅对 Microsoft SQL Server的 TLS 1.2 支持
  • 通过执行以下操作之一,要求系统管理员在客户端和服务器计算机上临时启用 TLS 1.0 或 TLS 1.1:
    • 使用 IIS 加密工具中的“密码套件”选项卡验证和更改当前 TLS 设置。
    • 启动注册表编辑器,并找到特定于 Schannel 的注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL。 有关详细信息,请参阅 TLS 1.2 升级工作流升级到 TLS 1.2 后的 SSL 错误

方案 2:在客户端和服务器上匹配 TLS 协议,但没有匹配的 TLS 密码套件

当你或你的管理员为了提高安全性而限制客户端或服务器上的某些算法时,会出现这种情况。

客户端和服务器 TLS 版本、密码套件可以在客户端Hello服务器Hello网络跟踪中的数据包中轻松检查。 客户端Hello数据包播发所有客户端密码套件,而服务器Hello数据包指定其中一个。 如果没有匹配的套件,服务器将关闭连接,而不是响应服务器Hello数据包。

解决方案

若要检查此问题,请执行以下步骤:

  1. 如果网络跟踪不可用,检查此注册表项下的函数值:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002

    使用以下 PowerShell 命令查找 TLS 函数。

    Get-ItemPropertyValue  -Path HKLM:\System\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\ -Name Functions
    
  2. 使用 IIS 加密工具中的“密码套件”选项卡检查是否存在任何匹配算法。 如果未找到匹配的算法,请联系Microsoft 支持部门。

有关详细信息,请参阅 TLS 1.2 升级工作流传输层安全性 (TLS) 连接或尝试恢复时连接可能会失败或超时

方案 3:可能已启用TLS_DHE密码

当客户端或服务器托管在 Windows 2012、2016 和更高版本上时,会出现此问题。 尽管两个操作系统版本具有相同的密码 (TLS_DHE*) ,但 Windows 2012 和 2016+ 以不同的方式处理 TLS 中的加密密钥。 这可能会导致通信错误。

解决方案

若要解决此问题,请从本地策略中删除以“TLS_DHE*”开头的所有密码。 有关应用程序尝试连接到 Windows 中的SQL Server时发生的错误的详细信息,请参阅在 Windows 中连接 SQL Server 时应用程序遇到强制关闭 TLS 连接错误

方案 4:SQL Server使用由弱哈希算法(例如 MD5、SHA224 或 SHA512)签名的证书

SQL Server始终加密与登录相关的网络数据包。 为此,它使用手动预配的证书或 自签名证书。 如果SQL Server在证书存储中找到了支持服务器身份验证功能的证书,则会使用该证书。 SQL Server使用此证书,即使尚未手动预配。 如果这些证书使用弱哈希算法 (指纹算法) (如 MD5、SHA224 或 SHA512),则它们将不适用于 TLS 1.2 并导致前面提到的错误。

注意

自签名证书不受此问题的影响。

解决方案

要解决这个问题,请按照下列步骤操作:

  1. “SQL Server 配置管理器”中,展开“控制台”窗格中SQL Server“网络配置”。
  2. 选择“协议”以获取 <实例名称>。
  3. 选择“ 证书 ”选项卡,然后按照相关步骤操作:
    • 如果显示证书,请选择“ 查看 ”以检查指纹算法,以确认它是否使用弱哈希算法。 然后,选择“ 清除 ”并转到步骤 4。
    • 如果未显示证书,请查看SQL Server错误日志中类似于以下内容的条目,并记下哈希值或指纹值:
      2017-05-30 14:59:30.89 spid15s The certificate [Cert Hash(sha1) "B3029394BB92AA8EDA0B8E37BAD09345B4992E3D"] was successfully loaded for encryption
  4. 使用以下步骤删除服务器身份验证:
    1. 选择“ 开始>运行”,然后键入 MMC。 (MMC 也称为 Microsoft 管理控制台。)
    2. 在 MMC 中,打开证书,然后在“证书”管理单元屏幕中选择“计算机帐户”。
    3. 展开 “个人>证书”。
    4. 找到SQL Server使用的证书,方法是按名称或检查证书存储中不同证书的指纹值,并打开其“属性”窗格。
    5. 在“ 常规 ”选项卡上,选择“ 仅启用以下用途 ”并取消选择“ 服务器身份验证”。
  5. 重启SQL Server服务。

方案 5:客户端和服务器使用 TLS_DHE 密码套件进行 TLS 握手,但其中一个系统没有安装TLS_DHE的前导零修补程序

有关此方案的详细信息,请参阅 在 Windows 中连接 SQL Server 时应用程序遇到强制关闭 TLS 连接错误

注意

如果本文尚未解决你的问题,你可以检查常见连接问题文章是否有帮助。

方案 6:TCP Three-Way 握手超时 (SYN 失败,由于 IOCP 辅助角色短缺,TCP 拒绝)

在 SQL Server 2017 及更早版本的工作负荷较高的系统中,你可能会观察到 TCP 三向握手失败导致的间歇性 10054 错误,从而导致 TCP 拒绝。 此问题的根本原因可能是处理 TCPAcceptEx 请求的延迟。 此延迟可能是由于缺少 IOCP (输入/输出完成端口) 负责管理接收传入连接的侦听器工作者。 IOCP 辅助角色数量不足以及忙于处理其他请求会导致连接请求处理延迟,最终导致握手失败和 TCP 拒绝。 在启动 SSL 握手 ((如果有任何) )或登录请求的处理(涉及身份验证检查)期间,还可以观察到登录超时。

解决方案

分配给处理身份验证和加密操作的 IOCP 辅助角色和 SOS 辅助角色资源不足是 TCP 三向握手超时和其他登录超时main原因。 SQL Server 2019 包括此领域的多项性能改进。 一个值得注意的增强是实现专用登录调度程序池。 这优化了与登录相关的任务的资源分配,从而减少超时的发生并提高整体系统性能。

TLS 连接失败的其他情况

如果遇到的错误消息与上述任何方案不对应,请参阅以下附加方案:

另请参阅

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。