Udostępnij za pośrednictwem


Podczas nawiązywania połączenia z serwerami SQL w systemie Windows w aplikacjach występują błędy wymuszonego zamknięcia połączenia TLS

Ten artykuł pomaga rozwiązać problem występujący, gdy aplikacja próbuje otworzyć połączenie z SQL Server.

Dotyczy: Windows Server 2019, Windows Server 2016
Oryginalny numer KB: 4557473

Symptomy

Gdy aplikacja próbuje otworzyć połączenie z SQL Server, zostanie wyświetlony jeden z następujących komunikatów o błędach:

Połączenie z serwerem zostało pomyślnie nawiązane, ale wystąpił błąd podczas procesu logowania. (dostawca: dostawca protokołu SSL, błąd: 0 — istniejące połączenie zostało wymuszone przez hosta zdalnego).

Połączenie z serwerem zostało pomyślnie nawiązane, ale wystąpił błąd podczas uzgadniania przed zalogowaniem. (dostawca: dostawca TCP, błąd: 0 — istniejące połączenie zostało wymuszone przez hosta zdalnego).

Jeśli włączono rejestrowanie SChannel na serwerze, otrzymasz identyfikator zdarzenia 36888 (alert krytyczny został wygenerowany), gdy wystąpi problem.

Uwaga

  • W zależności od używanego dostawcy lub sterownika komunikat o błędzie może się nieco różnić.
  • Ten problem występuje również, gdy aplikacja działająca w Windows Server 2012 R2 próbuje nawiązać połączenie z SQL Server uruchomionym w systemie Windows Server 2019.
  • Inne aplikacje klienckie-serwerowe mogą napotkać podobny problem.

Przyczyna

Windows 10, wersja 1511 i nowsze wersje systemu Windows, w tym Windows Server 2016 lub Windows 10, wersja 1607, która ma aktualizacje wydane 25 lutego lub nowsze aktualizacje zainstalowane, zawiera wiodącą aktualizację zerową. Tymczasem wszystkie wersje systemu Windows, które zostały wydane wcześniej, nie zawierają wiodących aktualizacji zerowych.

Klient I serwer protokołu TLS muszą obliczyć klucze dokładnie w taki sam sposób, w przeciwnym razie uzyskają różne wyniki. Połączenia TLS losowo kończą się niepowodzeniem, jeśli zera wiodące są obliczane inaczej przez klienta protokołu TLS i serwery TLS.

Gdy grupa wymiany kluczy Diffie-Hellman ma zera wiodące, nieprzypisane komputery mogą niepoprawnie obliczyć komputer mac, nie uwzględniając wyściełanych zer. Ten problem jest zwykle widoczny podczas interakcji z implementacjami kryptografii opartymi na systemie Windows i może powodować sporadyczne błędy negocjacji.

Komunikaty o błędach są zwracane, gdy bezpieczny uzgadnianie protokołu TLS jest negocjowane między klientem a serwerem przy użyciu zestawu szyfrowania TLS_DHE. Użycie jednego z zestawów szyfrowania, którego dotyczy problem, można zidentyfikować w pakiecie "Server Hello". Aby uzyskać więcej informacji, zobacz fragment kodu sieciowego w sekcji "Więcej informacji".

Rozwiązanie

Aby rozwiązać ten problem, upewnij się, że zarówno klient, jak i serwer biorący udział w połączeniu mają zainstalowany system Windows z wiodącymi zerowymi poprawkami dla TLS_DHE. Zaleca się zainstalowanie aktualizacji, ponieważ zwiększają one zgodność ze specyfikacjami TLS_DHE.

Poniżej wymieniono wersję systemu operacyjnego zgodnie z zainstalowanymi aktualizacjami.

Wersje systemu Windows zawierające wiodące zero poprawek dla TLS_DHE

  • Windows Server 2016, wersja 1607
    • KB 4537806: 25 lutego 2020-KB4537806 (kompilacja systemu operacyjnego 14393.3542)
    • KB 4540670: 10 marca 2020-KB4540670 (kompilacja systemu operacyjnego 14393.3564)
    • Aktualizacje, które zastąpią KB4537806 i KB4540670 dla odpowiednich wersji systemu operacyjnego
  • Windows Server 2019 RTM i nowsze wersje.
  • Windows 10, wersja 1511 i nowsze wersje Windows 10 (zobacz historię wydania)

Wersje systemu Windows, które nie zawierają wiodących poprawek zerowych dla TLS_DHE

  • Windows Server 2016, serwery w wersji 1607, na których nie zastosowano poprawek KB 4537806 i KB 4540670.
  • Windows 10, wersja 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 i wcześniejszych wersji systemu Windows Server

Obejście problemu

Jeśli nie możesz zaktualizować systemu Windows, jako obejście możesz wyłączyć szyfrowanie TLS_DHE przy użyciu jednej z dwóch metod.

Używanie zasad grupy

szyfrowanie TLS_DHE_* można wyłączyć przy użyciu zasady grupy. Zapoznaj się z tematem Określanie priorytetów pakietów szyfrowania Schannel , aby skonfigurować zasady grupy "Kolejność zestawu szyfrowania SSL".

Adres URL zasad: Konfiguracja komputera —> Szablony administracyjne —> Sieć —> Ustawienia konfiguracji protokołu SSL
Ustawienie zasad: ustawienie kolejność zestawu szyfrowania SSL.

Używanie skryptu programu 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
    }
}

Więcej informacji

Możesz potwierdzić, że ten problem występuje podczas nawiązywania połączenia. W przypadku wystąpienia problemu w śledzenia sieci na serwerze można zobaczyć następującą sekwencję.

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  

Badanie pakietu Hello serwera w celu wyświetlenia używanego zestawu szyfrowania:

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

Odwołanie

Aby uzyskać więcej informacji, zapoznaj się z następującymi artykułami: