Program drabbas av tvångsslutna TLS-anslutningsfel vid anslutning av SQL-servrar i Windows

Den här artikeln hjälper dig att åtgärda ett problem som uppstår när ett program försöker öppna en anslutning till en SQL Server.

Gäller för: Windows Server 2019, Windows Server 2016
Ursprungligt KB-nummer: 4557473

Symptom

När ett program försöker öppna en anslutning till en SQL Server visas något av följande felmeddelanden:

En anslutning upprättades med servern, men sedan uppstod ett fel under inloggningsprocessen. (provider: SSL-provider, fel: 0 – En befintlig anslutning stängdes med två skäl av fjärrvärden.)

En anslutning upprättades med servern, men sedan uppstod ett fel under handskakningen före inloggningen. (provider: TCP-provider, fel: 0 – En befintlig anslutning stängdes med två skäl av fjärrvärden.)

Om du har aktiverat SChannel-loggning på servern får du händelse-ID 36888 (en dödlig avisering genererades) när problemet uppstår.

Obs!

  • Beroende på vilken leverantör eller drivrutin du använder kan felmeddelandet variera något.
  • Det här problemet uppstår också när ett program som körs på Windows Server 2012 R2 försöker ansluta till SQL Server som körs på Windows Server 2019.
  • Andra klient-serverprogram kan stöta på ett liknande problem.

Orsak

Windows 10 version 1511 och senare versioner av Windows, inklusive Windows Server 2016 eller Windows 10 version 1607 med uppdateringar som släpptes den 25 februarieller senare installerade uppdateringar, innehåller en inledande nolluppdatering. Under tiden innehåller inte alla Windows-versioner som släpptes tidigare de inledande nolluppdateringarna.

TLS-klienten och -servern måste beräkna nycklar på exakt samma sätt, annars får de olika resultat. TLS-anslutningar misslyckas slumpmässigt om inledande nollor beräknas på olika sätt av TLS-klienten och TLS-servrarna.

När en Diffie-Hellman-nyckelutbytesgrupp har inledande nollor, kan oparcherade datorer felaktigt beräkna mac genom att inte redovisa de vadderade nollorna. Det här problemet uppstår vanligtvis när du interagerar med icke-Windows-baserade kryptoimplementeringar och kan orsaka tillfälliga förhandlingsfel.

Felmeddelandena returneras när den säkra TLS-handskakningen förhandlas mellan klienten och servern med hjälp av TLS_DHE chiffersvit. Användningen av en av de berörda chiffersviterna kan identifieras i "Server Hello"-paketet. Mer information finns i nätverksfragmentet i avsnittet "Mer information".

Åtgärd

Åtgärda problemet genom att se till att både klienten och servern som är inblandad i en anslutning kör Windows som har de inledande nollkorrigeringarna för TLS_DHE installerade. Vi rekommenderar att du installerar uppdateringarna eftersom de förbättrar överensstämmelsen med TLS_DHE specifikationer.

Följande lista över operativsystemversionen enligt de uppdateringar som är installerade.

Windows-versioner som innehåller inledande nollkorrigeringar för TLS_DHE

  • Windows Server 2016, version 1607
    • KB 4537806: 25 februari 2020-KB4537806 (OS Build 14393.3542)
    • KB 4540670: 10 mars 2020-KB4540670 (OS Build 14393.3564)
    • Uppdateringar som ersätter KB4537806 och KB4540670 för respektive os-versioner
  • Windows Server 2019 RTM och senare versioner.
  • Windows 10 version 1511 och senare versioner av Windows 10 (se versionshistorik)

Windows-versioner som inte innehåller inledande nollkorrigeringar för TLS_DHE

  • Windows Server 2016 version 1607-servrar som inte har korrigeringarna KB 4537806 och KB 4540670 tillämpade.
  • Windows 10, version 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 och tidigare versioner av Windows Server

Lösning

Om du inte kan uppdatera Windows kan du inaktivera TLS_DHE chiffer med någon av de två metoderna.

Använd Grupprincip

TLS_DHE_* chiffer kan inaktiveras med hjälp av grupprincip. Se Prioritera Schannel Cipher Suites för att konfigurera grupprincipen "SSL Cipher Suite Order".

Princip-URL: Datorkonfiguration –> Administrativa mallar –> Nätverk –> SSL-konfigurationsinställningar
Principinställning: Inställning för SSL-chiffersvitordning.

Använda ett PowerShell-skript

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
    }
}

Mer information

Du kan bekräfta att du stöter på det här problemet under anslutningsetableringen. När problemet uppstår kan du se följande sekvens i nätverksspårningen på servern.

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  

Undersöka Server Hello-paketet för att se chiffersviten som används:

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

Referens

Mer information finns i följande artiklar: