Środowisko aplikacji wymusza błędy połączenia TLS podczas nawiązywania połączenia z serwerami SQL w systemie Windows
Ten artykuł pomaga rozwiązać problem występujący, gdy aplikacja próbuje otworzyć połączenie z programem SQL Server.
Dotyczy: Windows Server 2019, Windows Server 2016
Oryginalny numer KB: 4557473
Symptomy
Gdy aplikacja próbuje otworzyć połączenie z programem 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 SSL, błąd: 0 — istniejące połączenie zostało wymuszone przez hosta zdalnego).
Połączenie z serwerem zostało pomyślnie ustanowione, ale wystąpił błąd podczas uzgadniania przed logowaniem. (dostawca: dostawca TCP, błąd: 0 — istniejące połączenie zostało wymuszone przez hosta zdalnego).
Jeśli włączono rejestrowanie SChannel na serwerze, po wystąpieniu problemu otrzymasz identyfikator zdarzenia 36888 (wygenerowano alert krytyczny).
Uwaga 16.
- W zależności od dostawcy lub sterownika, którego używasz, komunikat o błędzie może się nieco różnić.
- Ten problem występuje również, gdy aplikacja działająca w systemie Windows Server 2012 R2 próbuje nawiązać połączenie z programem SQL Server uruchomionym w systemie Windows Server 2019.
- Inne aplikacje klient-serwer mogą napotkać podobny problem.
Przyczyna
Windows 10, wersja 1511 i nowsze systemu Windows, w tym Windows Server 2016 lub Windows 10, wersja 1607, która ma aktualizacje wydane 25 lutego później zainstalowane aktualizacje, zawiera wiodącą aktualizację zerową. Tymczasem wszystkie wersje systemu Windows wydane wcześniej nie zawierają wiodących aktualizacji zerowych.
Klient i serwer TLS muszą obliczyć klucze dokładnie w taki sam sposób, w przeciwnym razie uzyskują różne wyniki. Połączenia TLS losowo kończą się niepowodzeniem, jeśli wiodące zera są obliczane inaczej przez klienta TLS i serwery TLS.
Gdy grupa wymiany kluczy Diffie-Hellman ma wiodące zera, komputery niezaznaczone mogą niepoprawnie obliczyć komputer mac bez uwzględniania wyściełanych zer. Ten problem jest zwykle spotykany podczas interakcji z implementacjami kryptograficznymi nie 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órych dotyczy problem, można zidentyfikować w pakiecie "Server Hello". Aby uzyskać więcej informacji, zobacz fragment kodu sieci 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 z systemem Windows mają zainstalowane wiodące poprawki zerowe 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 poprawki zerowe dla TLS_DHE
- Windows Server 2016, wersja 1607
- KB 4537806: 25 lutego 2020 r. —KB4537806 (kompilacja systemu operacyjnego 14393.3542)
- KB 4540670: 10 marca 2020 r. — KB4540670 (kompilacja systemu operacyjnego 14393.3564)
- Aktualizacje zastępujące KB4537806 i KB4540670 dla odpowiednich wersji systemu operacyjnego
- Windows Server 2019 RTM i nowsze wersje.
- Windows 10, wersja 1511 i nowsze wersje systemu Windows 10 (zobacz historię wersji)
Wersje systemu Windows, które nie zawierają wiodących poprawek zerowych dla TLS_DHE
- Windows Server 2016, wersja 1607 serwerów, które nie mają poprawek KB 4537806 i KB 4540670 zastosowane.
- Windows 10 w wersji 1507
- Windows 8.1
- Windows 7
- Windows Server 2012 R2 i starsze wersje systemu Windows Server
Rozwiązanie
Jeśli nie możesz zaktualizować systemu Windows, aby obejść ten problem, możesz wyłączyć TLS_DHE szyfry przy użyciu jednej z dwóch metod.
Za pomocą zasad grupy
TLS_DHE_* szyfrów można wyłączyć przy użyciu zasad grupy. Zapoznaj się z tematem Określanie priorytetów zestawów szyfrowania Schannel, aby skonfigurować zasady grupy "Kolejność szyfrowania SSL".
Adres URL zasad: Konfiguracja komputera —> Szablony administracyjne —> Sieć —> Ustawienia konfiguracji protokołu SSL
Ustawienie zasad: Ustawienie kolejności zestawu szyfrowania SSL.
Użycie 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 można zobaczyć następującą sekwencję w śladzie sieci na serwerze.
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 pakietu 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, zobacz następujące artykuły: