web-dev-qa-db-ja.com

TLS 1.2はSQL Serverリンクサーバーを壊します

最近のセキュリティブリッツの一環として、すべてのサーバーにTLS 1.2をセットアップしました。昨夜、すべてのSQLサーバーで "暗号化を強制する"フラグを反転し、それ以来、リンクサーバーに奇妙な問題が発生しました。

2台のサーバーがあります。

  • SQL Server 2016 SP2 CU3を実行するサーバーA

  • SQL Server 2012 SP4を実行するサーバーB

どちらにも正しい暗号化証明書があり、SSLとTLS 1.0&1.1を無効にするために必要なレジストリ編集が行われ、TLS 1.2のみが有効になっています。どちらにも、SQL Server Config Mgrで設定された証明書と「強制暗号化」が設定されています。

サーバーAからサーバーBへのリンクサーバー(2016から2012)は正常に動作します。サーバーBからAへのリンクサーバー(2012から2016)はサーバーを表示し、データベースを一覧表示しますが、そのリンクサーバーを介してテーブルをクエリしようとすると、エラーが発生します。

TCP Provider: The specified network name is no longer available. (Microsoft SQL Server, Error: 64)

ただし、サーバーBでSQL Server Management Studioセッションを開始して、サーバーAに問題なく接続できます。したがって、問題が発生しているのはそのリンクサーバーのみです。

サーバーAで拡張イベントを確認したところ、TLS 1.2を使用してサーバーBから送信されたSSLハンドシェイクのトレースイベントを確認できるため、接続要求は正しい暗号化セットで受信されています。

エラーをグーグルすることは名前解決の問題を示しているようなので、FQDNとIPアドレスの両方を使用して他のリンクサーバーをセットアップしようとしましたが、どちらも問題は解決しませんでした。

この時点で何らかの助けがあれば、私が残した残りの髪を救うでしょう。

ネットワークの問題を解消するために、下位互換性のために2012年のインスタンスが存在する2016年のサーバーの1つに行きました。同じ問題。 2016インスタンスは、2012インスタンスへのリンクサーバーをクエリできます。 2012インスタンスは、2016インスタンスへのリンクサーバーをクエリできません。 2つの2016年のインスタンス間の2番目のテストでも同じ問題がありました。

SQL Serverクライアントのバージョンは11.4.7462.6です。

レジストリ設定:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
5
Gavin Harris

Netmon、wireshark、netshなどのツールの使用に慣れていますか?この問題を再現するときに、キャプチャを実行することができます。サーバーBが外部の何か(つまり、証明書失効リストのCRLチェック)にヒットしようとしている可能性があり、その呼び出しは失敗しています。 CRLチェックは、方程式のクライアント側で行われます。この場合、サーバーBがクライアントです。トレースを実行できる場合は、クライアント(サーバーB)が関与しているTCPリセットをフィルタリングする必要があるでしょう。 Wiresharkでは、このためのフィルターはtcp.flags.reset == 1およびip.addr == 10.X.X.Xのようになります。ここで、10.X.X.XはサーバーBのIPアドレスです。

1
Sqlgrease