Errori di connessione TLS chiusi forzatamente nelle applicazioni durante la connessione di SQL Server in Windows
Questo articolo illustra come risolvere un problema che si verifica quando un'applicazione tenta di aprire una connessione a 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 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.
La connessione con il server è stata stabilita correttamente, ma poi si è verificato un errore durante l'handshake pre-login. (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 (viene generato un avviso irreversibile) quando si verifica il problema.
Note
- A seconda del provider o del driver in uso, il messaggio di errore può 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 successive di Windows, tra cui Window Server 2016 o Windows 10, versione 1607 con aggiornamenti rilasciati il 25 febbraio più tardi, contiene un aggiornamento zero iniziale. Nel frattempo, tutte le versioni di Windows rilasciate prima che non contengano gli aggiornamenti zero iniziali.
Il client TLS e il server devono calcolare le chiavi esattamente come in caso contrario 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 potrebbero calcolare erroneamente il mac non tenendo conto degli zeri riempiti. Questo problema viene in genere rilevato durante l'interazione 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 una delle suite di crittografia interessate 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 perché migliorano la conformità alle specifiche TLS_DHE.
Di seguito è elencata 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 sostituiscono 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 cronologia delle versioni)
Versioni di Windows che non contengono le correzioni zero iniziali per TLS_DHE
- Server Windows Server 2016 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.
Utilizzando criteri di gruppo
TLS_DHE_* crittografie possono essere disabilitate tramite Criteri di gruppo. Per configurare i criteri di gruppo "Ssl Cipher Suite Order", vedere Definizione delle priorità dei pacchetti di crittografia Schannel.
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 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 confermare che si verifica 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
Riferimenti
Per altre informazioni, vedere gli articoli seguenti: