Las aplicaciones experimentan errores de conexión TLS cerrados por la fuerza 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 un 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 un SQL Server, se muestra uno de los siguientes mensajes de error:

La conexión con el servidor se ha establecido correctamente, pero se ha producido un error durante el proceso de inicio de sesión. (proveedor: Proveedor SSL, error: 0 - El host remoto cerró forzadamente una conexión existente).

Se estableció correctamente una conexión con el servidor, pero luego se produjo un error durante el protocolo de enlace anterior al inicio de sesión. (proveedor: Proveedor TCP, error: 0 - El host remoto cerró forzadamente una conexión existente).

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:

  • En función 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 ejecutan 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 o actualizaciones posteriores instaladas, contiene una actualización cero inicial. Mientras tanto, todas las versiones de Windows que se publicaron antes no contienen las actualizaciones cero iniciales.

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

Cuando un grupo de intercambio de claves Diffie-Hellman tiene ceros iniciales, los equipos sin enviar pueden calcular incorrectamente el equipo 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 intermitentes de negociación.

Los mensajes de error se devuelven cuando se negocia el protocolo de enlace TLS seguro 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 solucionar 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. Se recomienda instalar las actualizaciones, ya que mejoran la conformidad con las especificaciones 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)
    • Novedades que reemplazan a 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 (consulte el historial de versiones)

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

  • Windows Server 2016, servidores de la versión 1607 que no tienen aplicadas las revisiones 4537806 KB y KB 4540670.
  • 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 de TLS_DHE mediante uno de los dos métodos.

Usar la directiva de grupo

Los cifrados TLS_DHE_* se pueden deshabilitar mediante directiva de grupo. Consulte Priorización de conjuntos de cifrado de Schannel para configurar la directiva de grupo "Orden del conjunto de cifrado SSL".

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.

Uso de 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  

Examinar el paquete Server Hello para ver el conjunto de cifrado que se usa:

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

Para más información, consulte los siguientes artículos: