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 Crypto (Ciphers suite 部分) 等工具检查是否有任何匹配的算法。 如果未找到匹配的算法,请联系 Microsoft 支持部门。
有关详细信息,请参阅 TLS 1.2 升级工作流 和 传输层安全性 (TLS) 连接或尝试恢复时连接可能会失败或超时。
方案 3: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服务。
方案 4:客户端和服务器使用 TLS_DHE 密码套件进行 TLS 握手,但其中一个系统没有安装TLS_DHE的前导零修补程序
有关此方案的详细信息,请参阅 在 Windows 中连接 SQL Server 时应用程序遇到强制关闭 TLS 连接错误。
如果本文尚未解决你的问题,你可以检查 常见连接问题文章 是否有帮助。
解决 SQL Server 中的连接问题
配置为使用加密和网络数据包大小的 SQL 服务器上的 SSIS 包出错
排查连接问题的建议先决条件和清单
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。