Windows で SQL Server を接続するときに、アプリケーションで強制的に閉じられた TLS 接続エラーが発生する

この記事は、アプリケーションがSQL Serverへの接続を開こうとしたときに発生する問題を解決するのに役立ちます。

適用対象:Windows Server 2019、Windows Server 2016
元の KB 番号: 4557473

現象

アプリケーションがSQL Serverへの接続を開こうとすると、次のいずれかのエラー メッセージが表示されます。

サーバーとの接続が正常に確立されましたが、ログイン プロセス中にエラーが発生しました。 (プロバイダー: SSL プロバイダー、エラー: 0 - リモート ホストによって既存の接続が強制的に閉じられました)。

サーバーとの接続が正常に確立されましたが、ログイン前ハンドシェイク中にエラーが発生しました。 (プロバイダー: TCP プロバイダー、エラー: 0 - リモート ホストによって既存の接続が強制的に閉じられました)。

サーバーで SChannel ログ記録 を有効にした場合、問題が発生したときに イベント ID 36888 (致命的なアラートが生成されました) が表示されます。

注:

  • 使用しているプロバイダーまたはドライバーによっては、エラー メッセージが若干異なる場合があります。
  • この問題は、Windows Server 2012 R2 で実行されているアプリケーションが Windows Server 2019 で実行されているSQL Serverに接続しようとしたときにも発生します。
  • 他のクライアント/サーバー アプリケーションでも同様の問題が発生する可能性があります。

原因

Windows 10、バージョン 1511 以降のバージョンの Windows (Windows Server 2016 または Windows 10 など)、2 月 25 日以降の更新プログラムがインストールされたバージョン 1607 には、先行するゼロ更新プログラムが含まれています。 一方、その前にリリースされたすべての Windows バージョンには、先行する 0 個の更新プログラムは含まれません。

TLS クライアントとサーバーは、キーをまったく同じ方法で計算する必要があります。そうしないと、異なる結果が得られます。 TLS クライアントと TLS サーバーによって先行ゼロの計算が異なる場合、TLS 接続はランダムに失敗します。

Diffie-Hellman キー交換グループに先行ゼロがある場合、パッチが適用されていないコンピューターでは、埋め込まれたゼロを計算しないことによって Mac が誤って計算される可能性があります。 この問題は通常、Windows ベース以外の暗号化実装と対話するときに発生し、間欠的なネゴシエーション エラーを引き起こす可能性があります。

セキュリティで保護された TLS ハンドシェイクが暗号スイートを使用してクライアントとサーバー間でネゴシエートされると、エラー メッセージTLS_DHE返されます。 影響を受ける暗号スイートの 1 つの使用は、"Server Hello" パケットで識別できます。 詳細については、「詳細情報」セクションのネットワーク スニペットを参照してください。

解決方法

この問題を解決するには、接続に関係するクライアントとサーバーの両方で、TLS_DHEの先行するゼロ修正プログラムがインストールされている Windows が実行されていることを確認します。 TLS_DHE仕様への準拠を強化するため、更新プログラムをインストールすることをお勧めします。

次に、インストールされている更新プログラムに従ってオペレーティング システムのバージョンを示します。

TLS_DHEの先行ゼロ修正プログラムを含む Windows バージョン

  • バージョン 1607 Windows Server 2016
    • KB 4537806: 2020-KB4537806 年 2 月 25 日 (OS ビルド 14393.3542)
    • KB 4540670: 2020 年 3 月 10 日-KB4540670 (OS ビルド 14393.3564)
    • 各 OS バージョンのKB4537806とKB4540670を置き換える更新
  • Windows Server 2019 RTM 以降のバージョン。
  • Windows 10、バージョン 1511、およびそれ以降のバージョンのWindows 10 (リリース履歴を参照)

TLS_DHEの先行する 0 個の修正プログラムが含まれていない Windows バージョン

  • Windows Server 2016、KB 4537806 と KB 4540670パッチが適用されていないバージョン 1607 サーバー。
  • バージョン 1507 Windows 10
  • Windows 8.1
  • Windows 7
  • R2 以前のバージョンの Windows Server をWindows Server 2012する

回避策

Windows を更新できない場合は、回避策として、2 つの方法のいずれかを使用してTLS_DHE暗号を無効にすることができます。

グループ ポリシーを使用する

TLS_DHE_* 暗号は、グループ ポリシーを使用して無効にすることができます。 「SSL 暗号スイートの順序」グループ ポリシーを構成するには、「 Schannel 暗号スイートの優先順位付け 」を参照してください。

ポリシー 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  

サーバー 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

関連情報

詳細については、次の記事を参照してください。