共用方式為


在 Windows 中連線 SQL Server 時,應用程式遇到強制關閉的 TLS 連線錯誤

本文可協助修正應用程式嘗試開啟與 SQL Server 的連線時所發生的問題。

適用於:Windows Server 2019,Windows Server 2016
原始 KB 編號: 4557473

徵狀

當應用程式嘗試開啟與 SQL Server 的連線時,會顯示下列其中一個錯誤訊息:

已成功與伺服器建立連線,但在登入流程期間發生錯誤。 (提供者:SSL 提供者,錯誤:0 - 遠端主機已強制關閉現有的連線。)

已成功與伺服器建立連線,但在登入前交握期間發生錯誤。 (提供者:TCP 提供者,錯誤:0 - 遠端主機已強制關閉現有的連線。)

如果您在伺服器上啟用 SChannel 記錄 ,則會收到 事件標識碼 36888 (發生問題時,) 產生嚴重警示

注意事項

  • 視您使用的提供者或驅動程式而定,錯誤訊息可能會稍有不同。
  • 當在 Windows Server 2012 R2 上執行的應用程式嘗試連線到在 Windows Server 2019 上執行的 SQL Server 時,也會發生此問題。
  • 其他客戶端伺服器應用程式可能會遇到類似的問題。

原因

Windows 10 版本 1511 和更新版本的 Windows,包括 Windows Server 2016 或 Windows 10 版本 1607,已在 2 月 25 日或更新版本安裝更新時發行,其中包含前置零更新。 同時,之前發行的所有 Windows 版本都不包含前置零更新。

TLS 用戶端和伺服器必須以完全相同的方式計算密鑰,否則會取得不同的結果。 如果 TLS 用戶端和 TLS 伺服器以不同方式計算前置零,TLS 連線就會隨機失敗。

Diffie-Hellman 金鑰交換 群組具有前置零時,未修補的計算機可能會因為未計算填補的零而不正確地計算 mac。 與非 Windows 型密碼編譯實作互動時,通常會看到此問題,而且可能會導致間歇性交涉失敗。

當用戶端與伺服器之間交涉安全 TLS 交握時,會使用TLS_DHE加密套件傳回錯誤訊息。 您可以在 「Server Hello」 封包中識別其中一個受影響加密套件的使用。 如需詳細資訊,請參閱一節中的網路代碼段。

解決方案

若要修正此問題,請確定與連線相關的用戶端和伺服器都執行 Windows,其中已安裝前置零修正TLS_DHE。 建議您安裝更新,因為它們可增強TLS_DHE規格的一致性。

下列會根據安裝的更新列出操作系統版本。

包含前置零修正程式的 Windows 版本TLS_DHE

  • Windows Server 2016 1607 版
    • KB 4537806:2020 年 2 月 25 日-KB4537806 (OS 組建 14393.3542)
    • KB 4540670:2020 年 3 月 10 日-KB4540670 (OS 組建 14393.3564)
    • 取代個別操作系統版本KB4537806和KB4540670的 匯報
  • Windows Server 2019 RTM 和更新版本。
  • Windows 10 版本 1511 和更新版本的 Windows 10 (請參閱發行歷程記錄)

未包含前置零修正程式的 Windows 版本TLS_DHE

  • Windows Server 2016,未套用修補程式 KB 4537806 和 KB 4540670的 1607 版伺服器。
  • Windows 10,版本 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 和舊版 Windows Server

因應措施

如果您無法更新 Windows,您可以使用兩種方法的其中一個來停用TLS_DHE加密。

使用群組原則

TLS_DHE_* 加密可以使用 群組原則 來停用。 請參閱 設定安全通道加密套件的優先順序 ,以設定「SSL 加密套件訂單」組策略。

原則 URL:計算機設定 -> 系統管理範本 -> 網路 -> SSL 組態設定
原則設定:SSL 加密套件順序設定。

使用 PowerShell 腳本

foreach ($CipherSuite in $(Get-TlsCipherSuite).Name)
{
    if ( $CipherSuite.substring(0,7) -eq "TLS_DHE" )
    {
       "Disabling cipher suite: " + $CipherSuite
       Disable-TlsCipherSuite -Name $CipherSuite
    }
    else
    {
        "Existing enabled cipher suite will remain enabled: " + $CipherSuite
    }
}

其他相關資訊

您可以確認在連線建立期間遇到此問題。 發生問題時,您可以在伺服器的網路追蹤中看到下列順序。

1103479 <DateTime> 382.4104867 <Application IP> <Server IP> TCP:Flags=CE....S., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174047, Ack=0, Win=8192 ( Negotiating scale factor 0x8 ) = 8192  
1103486 <DateTime> 382.4105589 <Server IP> <Application IP> TCP: [Bad CheckSum]Flags=...A..S., SrcPort=1433, DstPort=62702, PayloadLen=0, Seq=267349053, Ack=829174048, Win=65535 ( Negotiated scale factor 0x8 ) = 16776960  
1103493 <DateTime> 382.4113628 <Application IP> <Server IP> TCP:Flags=...A...., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174048, Ack=267349054, Win=513 (scale factor 0x8) = 131328  
1103515 <DateTime> 382.4117349 <Application IP> <Server IP> TDS:Prelogin, Version = 7.300000(No version information available, using the default version), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=62702, DstPort=1433, PayloadLen=88, Seq=829174048 - 829174136, Ack=267349054, Win=131328  
1103525 <DateTime> 382.4118186 <Server IP> <Application IP> TDS:Response, Version = 7.300000(No version information available, using the default version), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=1433, DstPort=62702, PayloadLen=48, Seq=267349054 - 267349102, Ack=829174136, Win=2102272  
1103547 <DateTime> 382.4128101 <Application IP> <Server IP> TLS:TLS Rec Layer-1 HandShake: Client Hello.  
1103584 <DateTime> 382.4151314 <Server IP> <Application IP> TLS:TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Key Exchange. Server Hello Done.  
1103595 <DateTime> 382.4161185 <Application IP> <Server IP> TCP:Flags=...A...., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174322, Ack=267351024, Win=513 (scale factor 0x8) = 131328  
1103676 <DateTime> 382.4782629 <Application IP> <Server IP> TLS:TLS Rec Layer-1 HandShake: Client Key Exchange.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec Layer-3 HandShake: Encrypted Handshake Message.  
1103692 <DateTime> 382.4901904 <Server IP> <Application IP> TCP:[Segment Lost] [Bad CheckSum]Flags=...A...F, SrcPort=1433, DstPort=62702, PayloadLen=0, Seq=267351024, Ack=829174648, Win=8210 (scale factor 0x8) = 2101760  
1103696 <DateTime> 382.4918048 <Application IP> <Server IP> TCP:Flags=...A...., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174648, Ack=267351025, Win=513 (scale factor 0x8) = 131328  
1103718 <DateTime> 382.4931068 <Application IP> <Server IP> TCP:Flags=...A...F, SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174648, Ack=267351025, Win=513 (scale factor 0x8) = 131328  
1103723 <DateTime> 382.4931475 <Server IP> <Application IP> TCP: [Bad CheckSum]Flags=...A...., SrcPort=1433, DstPort=62702, PayloadLen=0, Seq=267351025, Ack=829174649, Win=8210 (scale factor 0x8) = 2101760  

檢查 Server Hello 封包以查看正在使用的加密套件:

Frame: Number = 1103584, Captured Frame Length = 2093, MediaType = NetEvent  
+NetEvent:  
+MicrosoftWindowsNDISPacketCapture: Packet Fragment (1976 (0x7B8) bytes)  
+Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[00-00-0C-9F-F4-5C],SourceAddress:[00-1D-D8-B8-3A-7B]  
+Ipv4: Src = <Server IP>, Dest = <Application IP>, Next Protocol = TCP, Packet ID = 16076, Total IP Length = 0  
+Tcp: [Bad CheckSum]Flags=...AP..., SrcPort=1433, DstPort=62702, PayloadLen=1938, Seq=267349102 - 267351040, Ack=829174322, Win=8211 (scale factor 0x8) = 2102016  
+Tds: Prelogin, Version = 7.300000(No version information available, using the default version), SPID = 0, PacketID = 0, Flags=...AP..., SrcPort=1433, DstPort=62702, PayloadLen=1938, Seq=267349102 - 267351040, Ack=829174322, Win=2102016  
TLSSSLData: Transport Layer Security (TLS) Payload Data  
-TLS: TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Key Exchange. Server Hello Done.  
-TlsRecordLayer: TLS Rec Layer-1 HandShake:  
ContentType: HandShake:  
+Version: TLS 1.2  
Length: 1909 (0x775)  
-SSLHandshake: SSL HandShake Server Hello Done(0x0E)  
HandShakeType: ServerHello(0x02)  
Length: 81 (0x51)  
-ServerHello: 0x1  
+Version: TLS 1.2  
+RandomBytes:  
SessionIDLength: 32 (0x20)  
SessionID: Binary Large Object (32 Bytes)  
TLSCipherSuite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 { 0x00, 0x9F }  
CompressionMethods: 0 (0x0)  
ExtensionsLength: 9 (0x9)  
+ServerHelloExtension: Unknown Extension Type  
+ServerHelloExtension: Renegotiation Info(0xFF01)  
HandShakeType: Certificate(0x0B)  
Length: 778 (0x30A)  
+Cert: 0x1  
HandShakeType: Server Key Exchange(0x0C)  
Length: 1034 (0x40A)  
ServerKeyExchange: Binary Large Object (1034 Bytes)  
HandShakeType: Server Hello Done(0x0E)  
Length: 0 (0x0)  
+Tds: Prelogin, Version = 7.300000(No version information available, using the default version), Reassembled Packet

參考

如需詳細資訊,請參閱下列文章: