Windows'ta SQL Server'ları bağlarken uygulamalar zorla kapatılan TLS bağlantı hataları yaşar

Bu makale, bir uygulama bir SQL Server bağlantısını açmaya çalıştığında oluşan bir sorunu düzeltmeye yardımcı olur.

Şunlar için geçerlidir: Windows Server 2019, Windows Server 2016
Özgün KB numarası: 4557473

Belirtiler

Uygulama bir SQL Server bağlantısını açmaya çalıştığında aşağıdaki hata iletilerinden biri görüntülenir:

Sunucuyla başarıyla bağlantı kuruldu ancak oturum açma işlemi sırasında bir hata oluştu. (sağlayıcı: SSL Sağlayıcısı, hata: 0 - Var olan bir bağlantı uzak konak tarafından zorla kapatıldı.)

Sunucuyla başarıyla bağlantı kuruldu, ancak oturum açma öncesi el sıkışması sırasında bir hata oluştu. (sağlayıcı: TCP Sağlayıcısı, hata: 0 - Var olan bir bağlantı uzak konak tarafından zorla kapatıldı.)

Sunucuda SChannel günlüğünü etkinleştirdiyseniz, sorun oluştuğunda Olay Kimliği 36888 (Önemli Uyarı oluşturuldu) alırsınız.

Not

  • Kullandığınız sağlayıcıya veya sürücüye bağlı olarak, hata iletisi biraz farklılık gösterebilir.
  • Bu sorun, Windows Server 2012 R2 üzerinde çalışan bir uygulama Windows Server 2019'da çalışan SQL Server bağlanmaya çalıştığında da oluşur.
  • Diğer istemci-sunucu uygulamaları da benzer bir sorunla karşılaşabilir.

Neden

Windows'un Windows Server 2016 veya Windows 10, sürüm 1607'nin 25 Şubat'ta yayımlanan güncelleştirmeleri içeren Windows 10, sürüm 1511 ve sonraki sürümleri başta sıfır güncelleştirme içerir. Bu arada, daha önce yayımlanan tüm Windows sürümleri baştaki sıfır güncelleştirmeleri içermez.

TLS istemcisinin ve sunucusunun anahtarları tam olarak aynı şekilde hesaplaması gerekir, aksi takdirde farklı sonuçlar alır. Baştaki sıfırlar TLS istemcisi ve TLS Sunucuları tarafından farklı şekilde hesaplanırsa TLS bağlantıları rastgele başarısız olur.

Bir Diffie-Hellman anahtar değişim grubunda öndeki sıfırlar olduğunda, eşleşmeyen bilgisayarlar doldurulan sıfırları hesaplamayarak mac'i yanlış hesaplayabilir. Bu sorun genellikle Windows tabanlı olmayan şifreleme uygulamalarıyla etkileşim kurarken görülür ve aralıklı anlaşma hatalarına neden olabilir.

İstemci ile sunucu arasında güvenli TLS el sıkışması TLS_DHE şifre paketi kullanılarak anlaşmaya varıldığında hata iletileri döndürülür. Etkilenen şifreleme paketlerinden birinin kullanımı "Sunucu Hello" paketinde tanımlanabilir. Daha fazla bilgi için "Daha fazla bilgi" bölümündeki ağ parçacığına bakın.

Çözüm

Bu sorunu çözmek için, bir bağlantıda yer alan istemcinin ve sunucunun, TLS_DHE için önde gelen sıfır düzeltmenin yüklü olduğu Windows'u çalıştırdığından emin olun. güncelleştirmelerin TLS_DHE belirtimlerine uyumluluğu artırdığından yüklenmesi önerilir.

Aşağıdaki listede yüklü güncelleştirmelere göre işletim sistemi sürümü listelenmiştir.

TLS_DHE için baştaki sıfır düzeltmeleri içeren Windows sürümleri

  • Windows Server 2016, sürüm 1607
    • KB 4537806: 25 Şubat 2020-KB4537806 (İs Derlemesi 14393.3542)
    • KB 4540670: 10 Mart 2020-KB4540670 (İs Derlemesi 14393.3564)
    • İlgili işletim sistemi sürümleri için KB4537806 ve KB4540670 yerine geçen Güncelleştirmeler
  • Windows Server 2019 RTM ve sonraki sürümleri.
  • Windows 10, sürüm 1511 ve Windows 10 sonraki sürümleri (sürüm geçmişine bakın)

TLS_DHE için baştaki sıfır düzeltmeleri içermeyen Windows sürümleri

  • Windows Server 2016, KB 4537806 ve KB 4540670 uygulanmamış düzeltme ekleri olmayan sürüm 1607 sunucuları.
  • Windows 10, sürüm 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 ve Windows Server'ın önceki sürümleri

Geçici Çözüm

Windows'u güncelleştiremiyorsanız, geçici bir çözüm olarak iki yöntemden birini kullanarak TLS_DHE şifrelerini devre dışı bırakabilirsiniz.

Grup İlkesi’ni Kullanma

TLS_DHE_* şifreleri grup ilkesi kullanılarak devre dışı bırakılabilir. "SSL Şifreleme Paketi Sırası" grup ilkesini yapılandırmak için Schannel Şifreleme Paketlerini Önceliklendirme bölümüne bakın.

İlke URL'si: Bilgisayar Yapılandırması -> Yönetim Şablonları -> Ağ -> SSL Yapılandırma Ayarları
İlke Ayarı: SSL Şifreleme Paketi Sırası ayarı.

PowerShell betiği kullanma

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
    }
}

Daha fazla bilgi

Bağlantı kurulması sırasında bu sorunla karşılaştığınızı onaylayabilirsiniz. Sorun oluştuğunda, sunucudaki ağ izlemesinde aşağıdaki sırayı görebilirsiniz.

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  

Kullanılan şifreleme paketini görmek için Sunucu Hello paketini inceleme:

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

Başvuru

Daha fazla bilgi için aşağıdaki makalelere bakın: