共用方式為


遠端主機強制關閉現有的連線(OS 錯誤 10054)

適用於:SQL Server

注意

開始進行疑難排解之前,建議您先檢查 必要條件並逐一瀏覽檢查清單。

本文詳細說明各種案例,並提供下列錯誤的解決方式:

  • 已順利建立與伺服器的連接,但隨後在登入過程中發生錯誤。 (提供者:SSL 提供者,錯誤:0 - 遠端主機強行關閉現有的連線。

  • 與伺服器的連接已成功建立,但在登入前的信號交換時發生錯誤。 (提供者:TCP 提供者,錯誤:0 - 遠端主機強行關閉現有的連線。

Windows 套接字層中引發操作系統錯誤 10054。 如需詳細資訊,請參閱 Windows 套接字錯誤碼:WSAECONNRESET 10054

何時看到錯誤?

安全通道也稱為 安全通道,是 安全性支援提供者 (SSP)。 它包含一組安全性通訊協定,可透過加密提供身分識別驗證和保護私人通訊。 安全通道 SSP 的其中一個功能是實作不同版本的 傳輸層安全性 (TLS) 通訊協定。 此通訊協定是一項業界標準,旨在保護透過因特網通訊的信息隱私權。

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:

案例 2:比對用戶端和伺服器上的 TLS 通訊協定,但沒有相符的 TLS 加密套件

當您或系統管理員限制用戶端或伺服器上的特定演算法,以取得額外的安全性時,就會發生此案例。

客戶端和伺服器 TLS 版本、加密套件可在網路追蹤的 Client Hello 和 Server Hello 封包中輕鬆檢查。 Client Hello 封包會公告所有用戶端加密套件,而 Server Hello 封包則指定其中一個。 如果沒有相符的套件,伺服器會關閉連線,而不是回應 Server 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:由於 IOCP 背景工作角色短缺,TCP 三向交握逾時(SYN 失敗、TCP 拒絕)

在 SQL Server 2017 和更早版本的高工作負載系統中,您可能會發現 TCP 三向交握失敗所造成的間歇性 10054 錯誤,導致 TCP 拒絕。 此問題的根本原因可能是處理 TCPAcceptEx 要求的延遲。 此延遲可能是 因為 IOCP(輸入/輸出完成埠)接聽程式 背景工作角色不足,負責管理傳入連線的接受。 IOCP 背景工作角色數目不足,並忙於為其他要求提供服務,導致連線要求的處理延遲,最終導致交握失敗和 TCP 拒絕。 您也可以在啟動 SSL 交握期間觀察登入逾時(如果有的話)或登入要求的處理,這些要求涉及驗證檢查。

解決方法

配置用來處理驗證和加密作業的IOCP背景工作角色和SOS背景工作資源短缺,是TCP三向交握逾時和其他登入逾時的主要原因。 SQL Server 2019 在此領域包含數個效能改善。 一個值得注意的增強功能是專用登入發送器集區的實作。 這會優化登入相關工作的資源配置,以減少逾時次數並改善整體系統效能。

TLS 連線失敗的其他案例

如果您遇到的錯誤訊息未對應至上述任何案例,請參閱下列其他案例:

另請參閱

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。