Esperienza delle applicazioni con la chiusura forzata degli errori di connessione TLS durante la connessione di SQL Server in Windows
Questo articolo consente di risolvere un problema che si verifica quando un'applicazione tenta di aprire una connessione a un SQL Server.
Si applica a: Windows Server 2019, Windows Server 2016
Numero KB originale: 4557473
Sintomi
Quando un'applicazione tenta di aprire una connessione a un SQL Server, viene visualizzato uno dei messaggi di errore seguenti:
È stata stabilita una connessione con il server, ma si è verificato un errore durante il processo di accesso. (provider: Provider SSL, errore: 0 - Una connessione esistente è stata chiusa forzatamente dall'host remoto.
È stata stabilita una connessione con il server, ma si è verificato un errore durante l'handshake di pre-accesso. (provider: Provider TCP, errore: 0 - Una connessione esistente è stata chiusa forzatamente dall'host remoto.
Se è stata abilitata la registrazione SChannel nel server, si riceverà l'ID evento 36888 (è stato generato un avviso irreversibile) quando si verifica il problema.
Nota
- A seconda del provider o del driver in uso, il messaggio di errore potrebbe variare leggermente.
- Questo problema si verifica anche quando un'applicazione in esecuzione in Windows Server 2012 R2 tenta di connettersi a SQL Server in esecuzione in Windows Server 2019.
- Altre applicazioni client-server possono riscontrare un problema simile.
Causa
Windows 10, versione 1511 e versioni successive di Windows, tra cui Window Server 2016 o Windows 10, versione 1607 in cui sono installati gli aggiornamenti rilasciati il 25 febbraio o gli aggiornamenti successivi, contiene un aggiornamento zero iniziale. Nel frattempo, tutte le versioni di Windows rilasciate prima non contengono gli aggiornamenti zero iniziali.
Il client E il server TLS devono calcolare le chiavi esattamente allo stesso modo altrimenti ottengono risultati diversi. Le connessioni TLS hanno esito negativo in modo casuale se gli zeri iniziali vengono calcolati in modo diverso dal client TLS e dai server TLS.
Quando un gruppo di scambio di chiavi Diffie-Hellman ha zeri iniziali, i computer senza patch possono calcolare erroneamente il mac non tenendo conto degli zeri riempiti. Questo problema si verifica in genere quando si interagisce con implementazioni di crittografia non basate su Windows e può causare errori di negoziazione intermittenti.
I messaggi di errore vengono restituiti quando l'handshake TLS sicuro viene negoziato tra il client e il server usando TLS_DHE suite di crittografia. L'uso di uno dei pacchetti di crittografia interessati può essere identificato nel pacchetto "Server Hello". Per altre informazioni, vedere il frammento di rete nella sezione "Altre informazioni".
Risoluzione
Per risolvere questo problema, assicurarsi che sia il client che il server coinvolti in una connessione eseguano Windows con le correzioni zero iniziali per TLS_DHE installate. È consigliabile installare gli aggiornamenti poiché migliorano la conformità alle specifiche TLS_DHE.
Di seguito è riportata la versione del sistema operativo in base agli aggiornamenti installati.
Versioni di Windows che contengono le correzioni zero iniziali per TLS_DHE
- Windows Server 2016 versione 1607
- KB 4537806: 25 febbraio 2020-KB4537806 (build del sistema operativo 14393.3542)
- KB 4540670: 10 marzo 2020-KB4540670 (build del sistema operativo 14393.3564)
- Aggiornamenti che sostituisce KB4537806 e KB4540670 per le rispettive versioni del sistema operativo
- Windows Server 2019 RTM e versioni successive.
- Windows 10, versione 1511 e versioni successive di Windows 10 (vedere la cronologia delle versioni)
Versioni di Windows che non contengono le correzioni zero iniziali per TLS_DHE
- Windows Server 2016, i server versione 1607 che non hanno le patch KB 4537806 e KB 4540670 applicate.
- Windows 10, versione 1507
- Windows 8.1
- Windows 7
- Windows Server 2012 R2 e versioni precedenti di Windows Server
Soluzione alternativa
Se non è possibile aggiornare Windows, come soluzione alternativa, è possibile disabilitare le crittografie TLS_DHE usando uno dei due metodi.
Utilizzo di Criteri di gruppo
TLS_DHE_* è possibile disabilitare le crittografie usando Criteri di gruppo. Fare riferimento alla definizione della priorità dei pacchetti di crittografia Schannel per configurare i criteri di gruppo "SSL Cipher Suite Order".
URL dei criteri: Configurazione computer -> Modelli amministrativi -> Rete -> Impostazioni di configurazione SSL
Impostazione dei criteri: impostazione dell'ordine della suite di crittografia SSL.
Uso di uno script di 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
}
}
Ulteriori informazioni
È possibile verificare che si stia riscontrando questo problema durante la creazione della connessione. Quando si verifica il problema, è possibile visualizzare la sequenza seguente nella traccia di rete nel server.
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
Esame del pacchetto Server Hello per visualizzare la suite di crittografia in uso:
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
Riferimento
Per altre informazioni, vedere gli articoli seguenti: