Partilhar via


Os aplicativos experimentam erros de conexão TLS fechados à força ao conectar SQL Servers no Windows

Este artigo ajuda a corrigir um problema que ocorre quando um aplicativo tenta abrir uma conexão com um SQL Server.

Aplica-se a: Windows Server 2019, Windows Server 2016
Número de KB original: 4557473

Sintomas

Quando um aplicativo tenta abrir uma conexão com um SQL Server, uma das seguintes mensagens de erro é exibida:

Uma conexão foi estabelecida com êxito com o servidor, mas ocorreu um erro durante o processo de logon. (provedor: Provedor SSL, erro: 0 – Uma conexão existente foi fechada à força pelo host remoto.)

Uma conexão foi estabelecida com êxito com o servidor, mas ocorreu um erro durante o aperto de mão pré-logon. (provedor: Provedor TCP, erro: 0 – Uma conexão existente foi fechada à força pelo host remoto.)

Se você habilitou o log do SChannel no Servidor, receberá a ID do Evento 36888 (um alerta fatal foi gerado) quando o problema ocorrer.

Observação

  • Dependendo do provedor ou driver que você está usando, a mensagem de erro pode variar ligeiramente.
  • Esse problema também ocorre quando um aplicativo em execução no Windows Server 2012 R2 tenta se conectar a SQL Server em execução no Windows Server 2019.
  • Outros aplicativos cliente-servidor podem encontrar um problema semelhante.

Motivo

Windows 10, versão 1511 e versões posteriores do Windows, incluindo Windows Server 2016 ou Windows 10, versão 1607 que tem atualizações lançadas em 25 de fevereiro ou atualizações posteriores instaladas, contém uma atualização zero líder. Enquanto isso, todas as versões do Windows lançadas antes disso não contêm as atualizações zero principais.

O cliente e o servidor TLS precisam calcular as chaves exatamente da mesma maneira, caso contrário, elas obtêm resultados diferentes. As conexões TLS falharão aleatoriamente se os zeros principais forem calculados de forma diferente pelo cliente TLS e pelos servidores TLS.

Quando um grupo de troca de chaves Diffie-Hellman tem zeros principais, computadores não corrigidos podem calcular incorretamente o mac não contabilizando os zeros acolchoados. Esse problema normalmente é visto ao interagir com implementações de criptografia não baseadas no Windows e pode causar falhas de negociação intermitentes.

As mensagens de erro são retornadas quando o aperto de mão TLS seguro é negociado entre o cliente e o servidor usando TLS_DHE pacote de criptografia. O uso de um dos pacotes de criptografia afetados pode ser identificado no pacote "Server Hello". Para obter mais informações, consulte o snippet de rede na seção "Mais informações".

Resolução

Para corrigir esse problema, verifique se o cliente e o servidor envolvidos em uma conexão estão executando o Windows que têm as correções zero principais para TLS_DHE instalados. É recomendável instalar as atualizações, pois elas aprimoram a conformidade com TLS_DHE especificações.

A lista a seguir a versão do sistema operacional de acordo com as atualizações instaladas.

Versões do Windows que contêm as correções de zero principais para TLS_DHE

  • Windows Server 2016, versão 1607
    • KB 4537806: 25 de fevereiro de 2020-KB4537806 (compilação do sistema operacional 14393.3542)
    • KB 4540670: 10 de março de 2020-KB4540670 (build do sistema operacional 14393.3564)
    • Atualizações que substituem KB4537806 e KB4540670 para as respectivas versões do sistema operacional
  • RTM do Windows Server 2019 e versões posteriores.
  • Windows 10, versão 1511 e versões posteriores do Windows 10 (confira histórico de lançamentos)

Versões do Windows que não contêm as correções de zero principais para TLS_DHE

  • Windows Server 2016, os servidores versão 1607 que não têm os patches KB 4537806 e KB 4540670 aplicados.
  • Windows 10, versão 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 e versões anteriores do Windows Server

Solução alternativa

Se você não puder atualizar o Windows, como uma solução alternativa, poderá desabilitar as cifras TLS_DHE usando um dos dois métodos.

Uso da Política de Grupo

As cifras TLS_DHE_* podem ser desabilitadas usando Política de Grupo. Consulte Priorizar o Schannel Cipher Suites para configurar a política de grupo "SSL Cipher Suite Order".

URL da Política: Configuração do Computador –> Modelos Administrativos –> Rede –> Configurações de SSL
Configuração da política: configuração do SSL Cipher Suite Order.

Usando um script do 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
    }
}

Mais informações

Você pode confirmar que está encontrando esse problema durante o estabelecimento de conexão. Quando o problema ocorrer, você pode ver a sequência a seguir no rastreamento de rede no 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  

Examinando o pacote Server Hello para ver o pacote de cifras que está sendo usado:

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

Referência

Para saber mais, confira os seguintes artigos: