Поделиться через


При подключении SQL Server в Windows приложениям возникают принудительно закрытые ошибки подключения TLS

Эта статья помогает устранить проблему, возникающую при попытке приложения открыть подключение к SQL Server.

Область применения: Windows Server 2019, Windows Server 2016
Исходный номер базы знаний: 4557473

Симптомы

Когда приложение пытается открыть подключение к SQL Server, отображается одно из следующих сообщений об ошибках:

Подключение к серверу успешно установлено, но затем произошла ошибка при входе. (поставщик: поставщик SSL, ошибка: 0 — существующее подключение было принудительно закрыто удаленным узлом.)

Подключение к серверу успешно установлено, но затем произошла ошибка в процессе подтверждения, предшествующего входу. (поставщик: поставщик TCP, ошибка: 0 — существующее подключение было принудительно закрыто удаленным узлом).

Если вы включили ведение журнала SChannel на сервере, при возникновении проблемы вы получите идентификатор события 36888 (неустранимая оповещение).

Примечание.

  • В зависимости от используемого поставщика или драйвера сообщение об ошибке может немного отличаться.
  • Эта проблема также возникает, когда приложение, работающее в Windows Server 2012 R2, пытается подключиться к SQL Server, работающему в Windows Server 2019.
  • Другие клиентские приложения могут столкнуться с аналогичной проблемой.

Причина

Windows 10 версии 1511 и более поздних версий Windows, включая Windows Server 2016 или Windows 10 версии 1607 с обновлениями, выпущенными 25 февраля, содержит начальный нулевой пакет обновления. Между тем, все версии Windows, выпущенные до этого, не содержат ведущих ноль обновлений.

Клиент TLS и сервер должны вычислять ключи точно так же, как в противном случае они получают разные результаты. Подключения TLS случайным образом завершаются ошибкой, если начальные нули вычисляются по-разному клиентом TLS и серверами TLS.

Если группа обмена ключами Diffie-Hellman имеет начальные нули, неподключенные компьютеры могут неправильно вычислить mac, не учитывая заполненные нули. Эта проблема обычно возникает при взаимодействии с реализациями криптографии, не основанными на Windows, и может привести к периодическим сбоям согласования.

Сообщения об ошибках возвращаются при согласовании безопасного подтверждения TLS между клиентом и сервером с помощью набора шифров TLS_DHE. Использование одного из затронутых наборов шифров можно определить в пакете Server Hello. Дополнительные сведения см. в фрагменте сетевого кода в разделе "Дополнительные сведения".

Решение

Чтобы устранить эту проблему, убедитесь, что клиент и сервер, участвующие в подключении, работают под управлением Windows с основными исправлениями нуля для установленных TLS_DHE. Рекомендуется установить обновления, так как они повышают соответствие спецификациям TLS_DHE.

Ниже приведен список версий операционной системы в соответствии с установленными обновлениями.

Версии Windows, содержащие начальные исправления нуля для TLS_DHE

  • Windows Server 2016 версии 1607
    • База знаний 4537806: 25 февраля 2020 г. KB4537806 (сборка ОС 14393.3542)
    • KB 4540670: 10 марта 2020 г. -KB4540670 (сборка ОС 14393.3564)
    • Обновления, заменяющие KB4537806 и KB4540670 для соответствующих версий ОС
  • Windows Server 2019 RTM и более поздних версий.
  • Windows 10, версия 1511 и более поздние версии Windows 10 (см . журнал выпусков)

Версии Windows, не содержащие начальные исправления нуля для TLS_DHE

  • Серверы Windows Server 2016 версии 1607, у которых нет исправлений 4537806 и базы знаний 4540670.
  • Windows 10 версии 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 и более ранние версии Windows Server

Обходное решение

Если вы не можете обновить Windows в качестве обходного решения, можно отключить TLS_DHE шифры с помощью одного из двух методов.

Использование групповой политики

шифры TLS_DHE_* можно отключить с помощью групповой политики. Ознакомьтесь с разделом "Приоритетирование наборов шифров Schannel", чтобы настроить групповую политику "Порядок набора шифров SSL".

URL-адрес политики: конфигурация компьютера —> административные шаблоны — сеть —>> параметры конфигурации SSL
Параметр политики: параметр заказа набора шифров SSL.

Использование скрипта 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
    }
}

Дополнительная информация

Вы можете подтвердить, что эта проблема возникает во время создания подключения. При возникновении проблемы на сервере можно увидеть следующую последовательность в трассировке сети.

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  

Изучение пакета Server Hello для просмотра используемого набора шифров:

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

Справочные материалы

Дополнительные сведения см. в следующих статьях: