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 original do KB: 4557473
Sintomas
Quando um aplicativo tenta abrir uma conexão com um SQL Server, uma das seguintes mensagens de erro é exibida:
Uma conexão com o servidor foi estabelecida com êxito, 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 com o servidor foi estabelecida com êxito, mas ocorreu um erro durante o handshake de pré-logon. (provedor: Provedor TCP, erro: 0 - Uma conexão existente foi fechada à força pelo host remoto.)
Se você habilitou o log 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 um pouco.
- Esse problema também ocorre quando um aplicativo em execução no Windows Server 2012 R2 tenta se conectar ao SQL Server em execução no Windows Server 2019.
- Outros aplicativos cliente-servidor podem encontrar um problema semelhante.
Causa
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 à esquerda. Enquanto isso, todas as versões do Windows lançadas antes disso não contêm as principais zero atualizações.
O cliente e o servidor TLS precisam calcular as chaves exatamente da mesma maneira, caso contrário, obterão resultados diferentes. As conexões TLS falham aleatoriamente se os zeros à esquerda forem calculados de forma diferente pelo cliente TLS e pelos servidores TLS.
Quando um grupo de troca de chaves Diffie-Hellman tem zeros à esquerda, computadores sem patch podem calcular incorretamente o mac por não contabilizar os zeros preenchidos. 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 handshake TLS seguro é negociado entre o cliente e o servidor usando TLS_DHE pacote de criptografia. O uso de um dos conjuntos de cifras afetados pode ser identificado no pacote "Server Hello". Para obter mais informações, consulte o snippet de rede na seção "Mais informações".
Solução
Para corrigir esse problema, verifique se o cliente e o servidor envolvidos em uma conexão estão executando o Windows que tem as principais correções zero para TLS_DHE instaladas. Recomenda-se instalar as atualizações, pois elas aumentam a conformidade com TLS_DHE especificações.
A seguir lista a versão do sistema operacional de acordo com as atualizações instaladas.
Versões do Windows que contêm as principais correções zero para TLS_DHE
- Windows Server 2016, versão 1607
- KB 4537806: 25 de fevereiro de 2020 a KB4537806 (Compilação 14393.3542 do SO)
- KB 4540670: 10 de março de 2020-KB4540670 (Compilação 14393.3564 do SO)
- Atualizações que substituem KB4537806 e KB4540670 para as respectivas versões do sistema operacional
- Windows Server 2019 RTM e versões posteriores.
- Windows 10, versão 1511 e versões posteriores do Windows 10 (consulte o histórico de versões)
Versões do Windows que não contêm as principais correções zero para TLS_DHE
- Os servidores Windows Server 2016, 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 solução alternativa, poderá desabilitar as criptografias TLS_DHE usando um dos dois métodos.
Usar a Política de Grupo
As criptografias TLS_DHE_* podem ser desabilitadas usando a Diretiva de Grupo. Consulte Priorizando Conjuntos de Criptografia Schannel para configurar a política de grupo "Ordem do Conjunto de Criptografia SSL".
URL da política: Configuração do computador -> Modelos administrativos -> Rede -> Definições de configuração SSL
Configuração de política: Configuração de pedido do conjunto de cifras SSL.
Executa 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 da conexão. Quando o problema ocorre, 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 conjunto de criptografia 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 obter mais informações, consulte os seguintes artigos: