远程主机强行关闭了现有连接(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 版本,可以在网络跟踪的 Client Hello 和 Server Hello 数据包中轻松检查密码套件。 Client Hello 数据包播发所有客户端密码套件,而服务器 Hello 数据包指定其中一个。 如果没有匹配的套件,服务器会关闭连接,而不是响应 服务器 Hello 数据包。
解决方法
若要检查该问题,请执行以下步骤:
如果网络跟踪不可用,请检查此注册表项下的函数值:
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
使用 IIS 加密工具中的“密码套件”选项卡检查是否有任何匹配的算法。 如果未找到匹配算法,请联系Microsoft 支持部门。
有关详细信息,请参阅 TLS 1.2 升级工作流 和 传输层安全性(TLS)连接在连接或尝试恢复时可能会失败或超时。
方案 3:可能启用TLS_DHE密码
当客户端或服务器托管在 Windows 2012、2016 及更高版本上时,会出现此问题。 尽管两个 OS 版本具有相同的密码(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 并导致前面提到的错误。
注意
自签名证书不受此问题影响。
解决方法
若要解决该问题,请执行以下步骤:
- 在SQL Server 配置管理器中,在控制台窗格中展开 SQL Server 网络配置。
- 选择实例名称>的<协议。
- 选择“ 证书 ”选项卡,然后按照相关步骤操作:
- 如果显示证书,请选择“视图”以检查指纹算法,以确认它是否使用弱哈希算法。 然后选择“清除”并转到步骤 4。
- 如果未显示证书,请查看 SQL Server 错误日志,了解如下所示的条目,并记下哈希或指纹值:
2017-05-30 14:59:30.89 spid15s The certificate [Cert Hash(sha1) "B3029394BB92AA8EDA0B8E37BAD09345B4992E3D"] was successfully loaded for encryption
- 使用以下步骤删除服务器身份验证:
- 选择“开始”>“运行”,然后键入“MMC” 。 (MMC 也称为Microsoft管理控制台。
- 在 MMC 中,打开证书,然后在“证书”管理单元屏幕中选择“计算机帐户”。
- 展开“个人”>“证书”。
- 找到 SQL Server 在其名称上使用的证书,或通过检查证书存储中不同证书的指纹值并打开其 “属性 ”窗格。
- 在“常规”选项卡上,选择“只启用下列用途”并取消选择“服务器身份验证”。
- 重启 SQL Server 服务。
方案 5:客户端和服务器使用用于 TLS 握手的TLS_DHE密码套件,但其中一个系统没有安装TLS_DHE前导零修补程序
有关此情况的详细信息,请参阅在 Windows 中连接 SQL Server 时,应用程序遇到强制关闭 TLS 连接错误。
注意
如果本文尚未解决问题,可以检查常见连接问题文章是否有帮助。
方案 6:由于 IOCP 辅助角色短缺,TCP 三向握手超时(SYN 失败,TCP 拒绝)
在 SQL Server 2017 及更早版本的高工作负荷的系统中,你可能会发现 TCP 三向握手失败导致的间歇性 10054 错误,从而导致 TCP 拒绝。 此问题的根本原因可能是处理 TCPAcceptEx
请求的延迟。 此延迟可能是由于 IOCP(输入/输出完成端口)侦听器辅助角色的短缺,负责管理传入连接的接受。 IOCP 辅助角色的数量不足,并忙于为其他请求提供服务会导致连接请求的延迟处理,最终导致握手失败和 TCP 拒绝。 还可以在启动 SSL 握手(如果有)或登录请求的处理期间观察登录超时,这涉及到身份验证检查。
解决方法
分配给处理身份验证和加密操作的 IOCP 辅助角色和 SOS 辅助角色资源短缺是 TCP 三向握手超时和其他登录超时的主要原因。 SQL Server 2019 在此领域包括多项性能改进。 一个值得注意的增强是专用登录调度程序池的实现。 这优化了与登录相关的任务的资源的分配,这减少了超时的发生,并提高了系统的整体性能。
TLS 连接失败的其他方案
如果遇到的错误消息与上述任何方案不对应,请参阅以下其他方案:
- 使用 RSA 加密时,本地 SQL Server 无法连接到链接服务器
- SQL Server 升级后可能会出现连接错误 10054
- 在 SQL Server 中将节点添加到 AlwaysOn 环境时发生间歇性连接错误
- 使用 SQLCMD 实用工具时出现间歇性连接错误
- SQL Server 中的终结点 5022 上出现SSL_PE_NO_CIPHER错误
- SQL Sever 代理 SSIS 失败0x80004005出现连接错误
- 在 SQL Server 计算机上实现密码套件策略后出现“客户端无法建立连接”错误
- 更新 Windows Server 后出现“连接到链接服务器失败”错误
- SQL Server 代理连接到 SQL Server 时无法启动
- 使用 SQL Server 链接服务器功能将更高版本连接到较低版本的 SQL Server 时出错
另请参阅
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。