远程主机强制关闭现有连接

适用于:   SQL Server

备注

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

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

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

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

何时看到错误?

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

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

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

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

TLS 1.2 之前的 SSL 和 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 的版本。 有关详细信息,请参阅 TLS 1.2 对 Microsoft SQL Server 的支持
  • 通过执行以下操作之一,要求系统管理员在客户端和服务器计算机上暂时启用 TLS 1.0 或 TLS 1.1:

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

当你或管理员限制客户端或服务器上的某些算法以实现额外的安全性时,会发生这种情况。

客户端和服务器 TLS 版本、 密码套件 可在网络跟踪中的 Client HelloServer Hello 数据包中轻松检查。 客户端 Hello 数据包将播发所有客户端密码套件,而 Server 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 Crypto (密码套件部分) 工具来检查是否有任何匹配的算法。 如果找不到匹配的算法,请联系 Microsoft 支持人员。

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

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

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

备注

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

解决方案

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

  1. SQL Server 配置管理器中,在 控制台 窗格中展开 SQL Server网络配置
  2. 为其 <instance name>选择协议。
  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服务。

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

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

备注

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

另请参阅

第三方信息免责声明

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