Compartir a través de


Las aplicaciones experimentan errores de conexión TLS cerrados forzosamente al conectar servidores SQL Server en Windows

Este artículo ayuda a corregir un problema que se produce cuando una aplicación intenta abrir una conexión a sql Server.

Se aplica a: Windows Server 2019, Windows Server 2016
Número de KB original: 4557473

Síntomas

Cuando una aplicación intenta abrir una conexión a sql Server, se muestra uno de los siguientes mensajes de error:

Se estableció correctamente una conexión con el servidor, pero luego se produjo un error durante el proceso de inicio de sesión. (proveedor: proveedor SSL, error: 0: la conexión existente se cerró forzadamente por el host remoto).

Se ha establecido correctamente la conexión con el servidor, pero se ha producido un error durante el protocolo de enlace previo al inicio de sesión. (proveedor: proveedor TCP, error: 0: la conexión existente se cerró forzadamente por el host remoto).

Si ha habilitado el registro de SChannel en el servidor, recibirá el identificador de evento 36888 (se generó una alerta irrecuperable) cuando se produzca el problema.

Nota:

  • Dependiendo del proveedor o controlador que use, el mensaje de error puede variar ligeramente.
  • Este problema también se produce cuando una aplicación que se ejecuta en Windows Server 2012 R2 intenta conectarse a SQL Server que se ejecuta en Windows Server 2019.
  • Otras aplicaciones cliente-servidor pueden encontrar un problema similar.

Causa

Windows 10, versión 1511 y versiones posteriores de Windows, incluidas Windows Server 2016 o Windows 10, versión 1607 que tiene actualizaciones publicadas el 25 de febrero de 25thor actualizaciones posteriores instaladas, contiene una actualización cero inicial. Mientras tanto, todas las versiones de Windows publicadas antes de que no contengan las actualizaciones iniciales ceros.

El cliente y el servidor TLS deben calcular las claves exactamente de la misma manera; de lo contrario, obtienen resultados diferentes. Las conexiones TLS producen un error aleatorio si el cliente TLS y los servidores TLS calculan de forma diferente los ceros iniciales.

Cuando un grupo de intercambio de claves Diffie-Hellman tiene ceros iniciales, los equipos sin revisión pueden calcular incorrectamente el mac sin tener en cuenta los ceros rellenados. Este problema se suele ver al interactuar con implementaciones criptográficas no basadas en Windows y puede provocar errores de negociación intermitentes.

Los mensajes de error se devuelven cuando el protocolo de enlace TLS seguro se negocia entre el cliente y el servidor mediante TLS_DHE conjunto de cifrado. El uso de uno de los conjuntos de cifrado afectados se puede identificar en el paquete "Server Hello". Para obtener más información, consulte el fragmento de código de red en la sección "Más información".

Solución

Para corregir este problema, asegúrese de que tanto el cliente como el servidor implicados en una conexión ejecutan Windows que tienen instaladas las correcciones de cero iniciales para TLS_DHE instalado. Se recomienda instalar las actualizaciones, ya que mejoran la conformidad con las especificaciones de TLS_DHE.

A continuación se muestra la versión del sistema operativo según las actualizaciones instaladas.

Versiones de Windows que contienen las correcciones de cero iniciales para TLS_DHE

  • Windows Server 2016, versión 1607
    • KB 4537806: 25 de febrero de 2020-KB4537806 (compilación del sistema operativo 14393.3542)
    • KB 4540670: 10 de marzo de 2020-KB4540670 (compilación del sistema operativo 14393.3564)
    • Actualizaciones que reemplazan KB4537806 y KB4540670 para las versiones respectivas del sistema operativo
  • Windows Server 2019 RTM y versiones posteriores.
  • Windows 10, versión 1511 y versiones posteriores de Windows 10 (consulta el historial de versiones)

Versiones de Windows que no contienen las correcciones iniciales de cero para TLS_DHE

  • Servidores de Windows Server 2016, versión 1607 que no tienen las revisiones KB 4537806 y KB 4540670 aplicados.
  • Windows 10, versión 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 y versiones anteriores de Windows Server

Solución alternativa

Si no puede actualizar Windows, como solución alternativa, puede deshabilitar los cifrados TLS_DHE mediante uno de los dos métodos.

Uso de la directiva de grupo

los cifrados TLS_DHE_* se pueden deshabilitar mediante la directiva de grupo. Consulte Priorización de conjuntos de cifrado de Schannel para configurar la directiva de grupo "SSL Cipher Suite Order".

Dirección URL de directiva: Configuración del equipo -> Plantillas administrativas -> Red -> Configuración de SSL
Configuración de directiva: configuración de orden del conjunto de cifrado SSL.

Con un script de 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
    }
}

Más información

Puede confirmar que se encuentra con este problema durante el establecimiento de la conexión. Cuando se produce el problema, puede ver la siguiente secuencia en el seguimiento de red en el servidor.

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  

Examine el paquete Hello del servidor para ver que se usa el conjunto de cifrado:

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

Referencia

Vea los siguientes artículos para más información: