适用范围:SQL Server
总结
本文介绍发生SQL Server连接错误“远程主机强行关闭现有连接”的情况,并提供解决方法。 此错误与客户端和SQL Server之间的 TLS 握手失败有关,通常是因为客户端和服务器无法就 TLS 协议版本(例如 TLS 1.2 或 TLS 1.3)或密码套件达成一致。
本文介绍以下错误消息:
已成功与服务器建立连接,但在登录过程中发生错误。 (提供程序:SSL 提供程序,错误:0 - 远程主机强行关闭现有连接。
已成功与服务器建立连接,但是在预登录握手期间发生错误。 (提供程序:TCP 提供程序,错误:0 - 远程主机强行关闭现有连接。
操作系统错误 10054 在 Windows 套接字层中引发。 有关详细信息,请参阅 Windows 套接字错误代码:WSAECONNRESET 10054。
在开始故障排除之前,请检查 先决条件 并浏览清单。
发生此错误时
安全通道(也称为 Schannel)是 安全支持提供程序 (SSP)。 它包含一组安全协议,这些协议通过加密提供标识身份验证和保护专用通信。 Schannel SSP 的一个功能是实现传输层安全性 (TLS) 协议的不同版本。 TLS 是一种行业标准,旨在保护通过 Internet 通信的信息的隐私。
TLS 握手协议负责建立或恢复通过 TCP 通信的两个应用程序之间的安全会话所需的密钥交换。 在连接过程的预登录阶段,SQL Server和客户端应用程序使用 TLS 协议设置用于传输凭据的安全通道。
TLS 版本一目了然
下表比较了排查此错误时可能会遇到的 TLS 版本:
| 版本 | Windows的当前状态 | 有关SQL Server的建议 |
|---|---|---|
| TLS 1.0 / 1.1 | 默认情况下,在 Windows 11、Windows Server 2022 及更高版本上禁用。 被视为不安全。 | 请勿使用。 将客户端和服务器升级到 TLS 1.2 或更高版本。 |
| TLS 1.2 | 在所有受支持的Windows版本上默认启用。 广泛受 SQL Server 和现代客户端驱动程序支持。 | 建议的基线。 |
| TLS 1.3 | 支持Windows 11和Windows Server 2022及更高版本。 SQL Server 2022 及更高版本在配合当前版本的客户端驱动程序时受支持(例如,Microsoft ODBC Driver 18 和 Microsoft.Data.SqlClient 5.x)。 | 在客户端和服务器均支持的情况下使用。 |
有关Windows上 TLS 协议的当前支持状态,请参阅 TLS/SSL 中的协议(Schannel SSP)。
确定您的环境中适用的情形
以下部分介绍了可能导致握手失败的不同方案。 如果您不确定哪一种适合您的环境,可先参考以下几点来缩小范围:
- 在连接失败时,在客户端和服务器端捕获网络跟踪。 然后,检查 客户端 Hello 和 服务器 Hello 数据包,确认协商的 TLS 版本和密码套件。
- 检查SQL Server错误日志中的
successfully loaded for encryption条目,以确认正在使用哪个证书。 检查其指纹算法。 - 使用
Get-TlsCipherSuite和下面的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols注册表项比较客户端和服务器上的已启用 TLS 版本和密码套件。 - 确认客户端驱动程序支持 TLS 1.2 或更高版本。 旧驱动程序(如 SQL Server Native Client)已弃用,不建议这样做。
客户端和服务器之间没有匹配的 TLS 协议
安全套接字层(SSL)和低于 TLS 1.2 的 TLS 版本有多个已知漏洞。 在现代Windows版本中(Windows 11、Windows Server 2022及更高版本),默认情况下禁用 TLS 1.0 和 TLS 1.1。 管理员通常还会推送组策略或注册表设置,以在旧环境中禁用这些旧协议。
当应用程序使用较旧的开放数据库连接(ODBC)驱动程序、OLE DB 提供程序、.NET框架组件或不支持 TLS 1.2 或更高版本的SQL Server版本时,会发生连接错误。 发生此问题的原因是服务器和客户端找不到匹配的协议。 需要匹配协议才能完成 TLS 握手。
修复客户端和服务器之间的协议不匹配问题
若要解决此问题,请使用以下方法之一:
- 将SQL Server或客户端提供程序升级到支持 TLS 1.2 的版本(并尽可能升级为 TLS 1.3)。 有关详细信息,请参阅针对 Microsoft SQL Server 的 TLS 1.2 支持。
- 作为短期解决方法,请系统管理员暂时在客户端和服务器上启用 TLS 1.0 或 TLS 1.1。 仅在组件可以升级之前执行此操作。 使用以下操作之一:
- 使用 IIS 加密工具中的“密码套件”选项卡检查和更改当前的 TLS 设置。
- 启动注册表编辑器,并导航到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL下 Schannel 专用的注册表项。 有关详细信息,请参阅升级到 TLS 1.2 后TLS 1.2 升级工作流和 SSL 错误。
示例:TLS 1.2 的最低客户端驱动程序版本
使用原生支持 TLS 1.2 或更高版本的客户端组件。 以下组件是常见的安全基线:
- 适用于 SQL Server 的 Microsoft ODBC Driver 17 或 18。
- Microsoft OLE DB Driver 18 或 19(适用于 SQL Server)。
- .NET Framework 4.6.2 或更高版本,或任何受支持的.NET版本(.NET 6 及更高版本)。
- Microsoft JDBC Driver 9.4 或更高版本。
旧版 SQL Server Native Client (SNAC) 和随 Windows (SQLOLEDB) 附带的 SQL Server OLE DB 提供程序已弃用。 将它们替换为上一列表中的组件。
匹配 TLS 协议,但没有匹配的密码套件
当你或管理员限制客户端或服务器上的某些算法以增加安全性时,会出现这种情况。
可以在网络跟踪的 Client Hello 和 Server Hello 数据包中检查客户端和服务器 TLS 版本和密码套件。 Client Hello 数据包播发所有客户端密码套件,服务器 Hello 数据包返回服务器选取的套件。 如果没有匹配的套件,服务器会关闭连接,而不是发送 服务器 Hello 数据包。
修复密码套件不匹配问题
若要检查该问题,请执行以下步骤:
如果网络跟踪不可用,请检查此注册表项下的
Functions值: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在Windows 10、Windows 11、Windows Server 2016及更高版本上,还可以运行
Get-TlsCipherSuite以更易读的形式列出已启用的套件。使用 IIS 加密工具中的“密码套件”选项卡检查是否有任何匹配的算法。 如果未找到匹配算法,请联系Microsoft 支持部门。
有关详细信息,请参阅 TLS 1.2 升级工作流 和 传输层安全性(TLS)连接在连接或尝试恢复时可能会失败或超时。
在不同Windows版本上启用TLS_DHE密码套件
当客户端和服务器在不同的Windows版本(例如,Windows Server 2012和Windows Server 2016或更高版本)上运行以及播发TLS_DHE_*密码套件时,可能会出现此问题。 这些Windows版本以不同的方式处理 TLS 中的 Diffie-Hellman 密钥交换,这可能会导致握手失败。
删除TLS_DHE密码套件
若要解决此问题,请删除从本地策略开始 TLS_DHE_ 的所有密码套件。 有关应用程序尝试连接到 Windows 中的 SQL Server 时发生的错误的详细信息,请参阅 应用程序在 Windows 中连接 SQL Server 时遇到 TLS 连接被强制关闭错误。
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) "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"] was successfully loaded for encryption
从证书中删除服务器身份验证:
- 选择“开始>运行”,然后输入 MMC(Microsoft 管理控制台)。
- 在 MMC 中,添加 “证书” 管理单元并选择 “计算机帐户”。
- 展开 个人>证书。
- 查找SQL Server按名称或指纹使用的证书,并打开其“属性”窗格。
- 在“ 常规 ”选项卡上,选择 “仅启用以下目的 ”并清除 “服务器身份验证”。
重启 SQL Server 服务。
TLS_DHE前导零修复补丁未安装
当客户端和服务器为 TLS 握手协商 TLS_DHE_* 密码套件时,如果其中一方没有安装包含针对 Diffie-Hellman 密钥交换中前导零问题修复的 Windows 更新,就会出现这种情况。 有关此情况的详细信息,请参阅在 Windows 中连接 SQL Server 时,应用程序遇到强制关闭 TLS 连接错误。
注意
如果本文未解决问题,请检查 常见连接问题文章 是否有帮助。
由于 IOCP 工作线程短缺导致的 TCP 三次握手超时
在运行 SQL Server 2017 或更早版本的高负载系统上,可能会间歇性出现 10054 错误,这是由 TCP 三次握手失败引起的,并会进而导致 TCP 连接被拒绝。 根本原因通常是处理 TCPAcceptEx 请求的延迟。 延迟可能是由于 输入/输出完成端口(IOCP)侦听器工作线程 不足导致的,而这些线程负责接受传入连接。 当 IOCP 辅助角色太少或正在忙于处理其他请求时,连接请求会延迟处理,这会导致握手失败和 TCP 拒绝。 在 SSL 握手期间或处理登录请求期间,还可能会出现登录超时,而登录请求的处理涉及身份验证检查。
缓解 IOCP 辅助角色短缺和握手超时
IOCP 工作线程短缺,以及分配给身份验证和加密操作的 SOS 工作线程资源不足,是导致这些 TCP 三次握手超时和登录超时的主要原因。 SQL Server 2019 及更高版本包括此领域的多项性能改进。 一个值得注意的增强功能是专用的登录调度程序池,它优化了登录任务的资源分配。 此更改可减少超时并提高系统的整体性能。 如果受此问题影响,请计划升级到当前支持的SQL Server版本。
其他 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 时出错
相关内容
- 排查 SQL Server 中的连接问题
- 在配置为使用加密和网络数据包大小的 SQL 服务器上,SSIS 包出现错误
- 排查连接问题的建议先决条件和清单
- TLS/SSL 中的协议(Schannel SSP)
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。