Partager via


Les applications rencontrent des erreurs de connexion TLS fermées de force lors de la connexion de serveurs SQL Server dans Windows

Cet article vous aide à résoudre un problème qui se produit lorsqu’une application tente d’ouvrir une connexion à un serveur SQL Server.

S’applique à : Windows Server 2019, Windows Server 2016
Numéro de base de connaissances d’origine : 4557473

Symptômes

Lorsqu’une application tente d’ouvrir une connexion à un serveur SQL Server, l’un des messages d’erreur suivants s’affiche :

Une connexion a été établie avec le serveur, mais une erreur s’est ensuite produite pendant le processus de connexion. (fournisseur : Fournisseur SSL, erreur : 0 - Une connexion existante a été fermée de force par l’hôte distant.)

Une connexion a été établie avec le serveur, mais une erreur s'est ensuite produite pendant la négociation préalable à l'ouverture de session. (fournisseur : Fournisseur TCP, erreur : 0 - Une connexion existante a été fermée de force par l’hôte distant.)

Si vous avez activé la journalisation SChannel sur le serveur, vous recevrez l’ID d’événement 36888 (une alerte irrécupérable a été générée) lorsque le problème se produit.

Note

  • Selon le fournisseur ou le pilote que vous utilisez, le message d’erreur peut varier légèrement.
  • Ce problème se produit également lorsqu’une application s’exécutant sur Windows Server 2012 R2 tente de se connecter à SQL Server s’exécutant sur Windows Server 2019.
  • D’autres applications client-serveur peuvent rencontrer un problème similaire.

Cause

Windows 10, version 1511 et versions ultérieures de Windows, y compris Windows Server 2016 ou Windows 10, version 1607 qui a mis à jour les mises à jour publiées le 25 février plus tard installées, contient une mise à jour zéro de début. Pendant ce temps, toutes les versions de Windows publiées avant cela ne contiennent pas les dernières mises à jour.

Le client et le serveur TLS doivent calculer exactement les clés de la même façon, sinon ils obtiennent des résultats différents. Les connexions TLS échouent de façon aléatoire si les zéros non significatifs sont calculés différemment par le client TLS et les serveurs TLS.

Lorsqu’un groupe d’échange de clés Diffie-Hellman a des zéros non corrigés, les ordinateurs non corrigés peuvent calculer incorrectement le mac en ne tenant pas compte des zéros rembourrés. Ce problème est généralement observé lors de l’interaction avec des implémentations de chiffrement non basées sur Windows et peut entraîner des échecs de négociation intermittents.

Les messages d’erreur sont retournés lorsque la négociation TLS sécurisée est négociée entre le client et le serveur à l’aide de TLS_DHE suite de chiffrement. L’utilisation de l’une des suites de chiffrement affectées peut être identifiée dans le paquet « Server Hello ». Pour plus d’informations, consultez l’extrait de code réseau dans la section « Plus d’informations ».

Résolution

Pour résoudre ce problème, assurez-vous que le client et le serveur impliqués dans une connexion exécutent Windows avec les correctifs zéro de début pour TLS_DHE installés. Il est recommandé d’installer les mises à jour, car elles améliorent la conformité aux spécifications TLS_DHE.

La liste suivante répertorie la version du système d’exploitation en fonction des mises à jour installées.

Versions de Windows qui contiennent les correctifs zéro non significatifs pour TLS_DHE

  • Windows Server 2016, version 1607
    • Kb 4537806 : 25 février 2020-KB4537806 (build du système d’exploitation 14393.3542)
    • Kb 4540670 : 10 mars 2020-KB4540670 (build du système d’exploitation 14393.3564)
    • Mises à jour qui remplacent KB4537806 et KB4540670 pour les versions respectives du système d’exploitation
  • Windows Server 2019 RTM et versions ultérieures.
  • Windows 10, version 1511 et versions ultérieures de Windows 10 (voir l’historique des versions)

Versions de Windows qui ne contiennent pas les correctifs zéro non significatifs pour TLS_DHE

  • Serveurs Windows Server 2016, version 1607 qui n’ont pas les correctifs kb 4537806 et kb 4540670 appliqués.
  • Windows 10, version 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 et versions antérieures de Windows Server

Solution de contournement

Si vous ne pouvez pas mettre à jour Windows, comme solution de contournement, vous pouvez désactiver les chiffrements TLS_DHE à l’aide de l’une des deux méthodes.

Utilisation de la stratégie de groupe

les chiffrements TLS_DHE_* peuvent être désactivés à l’aide de la stratégie de groupe. Reportez-vous à Hiérarchisation des suites de chiffrement Schannel pour configurer la stratégie de groupe « Ordre des suites de chiffrement SSL ».

URL de stratégie : Configuration ordinateur -> Modèles d’administration -> Réseau -> Paramètres de configuration SSL
Paramètre de stratégie : paramètre ordre de suite de chiffrement SSL.

Utilisation d’un 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
    }
}

Plus d’informations

Vous pouvez confirmer que vous rencontrez ce problème pendant l’établissement de la connexion. Lorsque le problème se produit, vous pouvez voir la séquence suivante dans la trace réseau sur le serveur.

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  

Examen du paquet Server Hello pour voir la suite de chiffrement utilisée :

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

Référence

Pour plus d’informations, consultez les articles suivants :