適用対象: SQL Server
まとめ
この記事では、"既存の接続がリモート ホストによって強制的に閉じられました" というSQL Server接続エラーが発生し、解決策が提供されるシナリオについて説明します。 多くの場合、クライアントとサーバーが TLS プロトコル バージョン (TLS 1.2 や TLS 1.3 など) または暗号スイートに同意できないため、このエラーはクライアントとSQL Serverの間で失敗した TLS ハンドシェイクに関連付けられています。
この記事では、次のエラー メッセージについて説明します。
サーバーとの接続は正常に確立されましたが、ログイン プロセスでエラーが発生しました。 (プロバイダー: SSL プロバイダー、エラー: 0 - 既存の接続がリモート ホストによって強制的に閉じられました)。
サーバーとの接続を正常に確立しましたが、ログイン前のハンドシェイク中にエラーが発生しました。 (プロバイダー: TCP プロバイダー、エラー: 0 - 既存の接続がリモート ホストによって強制的に閉じられました)。
Windows ソケット レイヤーでオペレーティング システム エラー 10054 が発生しました。 詳細については、「 Windows ソケット エラー コード: WSAECONNRESET 10054」を参照してください。
トラブルシューティングを開始する前に、 前提条件 を確認し、チェックリストを参照してください。
このエラーが発生した場合
セキュリティで保護されたチャネル ( Schannel とも呼ばれます) は、 Security サポート プロバイダー (SSP) です。 これには、ID 認証と暗号化によるセキュリティで保護されたプライベート通信を提供する一連のセキュリティ プロトコルが含まれています。 Schannel SSP の 1 つの機能は、 Transport Layer Security (TLS) プロトコルの異なるバージョンを実装することです。 TLS は、インターネット経由で通信される情報のプライバシーを保護するために設計された業界標準です。
TLS ハンドシェイク プロトコルは、TCP 経由で通信する 2 つのアプリケーション間のセキュリティで保護されたセッションを確立または再開するために必要なキー交換を担当します。 接続プロセスのログイン前フェーズでは、SQL Serverおよびクライアント アプリケーションは TLS プロトコルを使用して、資格情報を送信するためのセキュリティで保護されたチャネルを設定します。
TLS バージョンの概要
次の表は、このエラーのトラブルシューティング時に発生する可能性がある TLS のバージョンを比較しています。
| バージョン | Windowsの現在の状態 | SQL Serverの推奨事項 |
|---|---|---|
| TLS 1.0 / 1.1 | Windows 11、Windows Server 2022、以降では既定で無効になっています。 安全でないと見なされます。 | 使用しないでください。 クライアントとサーバーを TLS 1.2 以降にアップグレードします。 |
| TLS 1.2 | サポートされているすべてのWindowsバージョンで既定で有効になります。 SQL Serverおよび最新のクライアント ドライバーによって広くサポートされています。 | 推奨されるベースライン。 |
| TLS 1.3 | Windows 11およびWindows Server 2022以降でサポートされます。 SQL Server 2022 以降と最新のクライアント ドライバー (例: Microsoft ODBC Driver 18 および Microsoft.Data.SqlClient 5.x) でサポートされます。 | クライアントとサーバーの両方でサポートされている場所を使用します。 |
Windowsでの TLS プロトコルの現在のサポート状態については、「
環境内で適用されるシナリオを特定する
次のセクションでは、ハンドシェイクが失敗する可能性があるさまざまなシナリオについて説明します。 環境に一致するものがわからない場合は、次の開始点を使用して絞り込みます。
- 接続の失敗中にクライアントとサーバーでネットワーク トレースをキャプチャします。 次に、 クライアント Hello パケットと サーバー Hello パケットを調べて、ネゴシエートされた TLS バージョンと暗号スイートを確認します。
-
successfully loaded for encryptionエントリのSQL Server エラー ログを調べて、使用されている証明書を確認します。 拇印アルゴリズムを確認します。 -
Get-TlsCipherSuiteとHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocolsのレジストリ キーを使用して、クライアントとサーバーで有効になっている TLS バージョンと暗号スイートを比較します。 - クライアント ドライバーが TLS 1.2 以降をサポートしていることを確認します。 SQL Server Native Client などの古いドライバーは非推奨であり、推奨されません。
クライアントとサーバーの間に一致する TLS プロトコルがない
SSL (Secure Sockets Layer) と TLS 1.2 より前のバージョンの TLS には、いくつかの既知の脆弱性があります。 最新のWindows リリース (Windows 11、Windows Server 2022、以降) では、TLS 1.0 と TLS 1.1 は既定で無効になっています。 管理者は、古い環境でこれらの古いプロトコルを無効にするために、多くの場合、グループ ポリシーまたはレジストリ設定をプッシュします。
接続エラーは、アプリケーションで古い Open Database Connectivity (ODBC) ドライバー、OLE DB プロバイダー、.NET Framework コンポーネント、または TLS 1.2 以降をサポートしていないSQL Serverバージョンを使用している場合に発生します。 この問題は、サーバーとクライアントが一致するプロトコルを見つけることができないために発生します。 TLS ハンドシェイクを完了するには、一致するプロトコルが必要です。
クライアントとサーバーの間のプロトコルの不一致を修正する
この問題を解決するには、以下のいずれかの方法を使用します。
- SQL Serverまたはクライアント プロバイダーを、TLS 1.2 (および可能な場合は TLS 1.3) をサポートするバージョンにアップグレードします。 詳細については、「Microsoft SQL Server 用の TLS 1.2 のサポート」を参照してください。
- 短期的な回避策として、クライアントとサーバーの両方で TLS 1.0 または TLS 1.1 を一時的に有効にするようにシステム管理者に依頼します。 これは、コンポーネントをアップグレードできるまで行います。 次のいずれかのアクションを使用します。
- IIS 暗号化ツールの [暗号スイート] タブを使用して、現在の TLS 設定を確認および変更します。
- レジストリ エディターを起動し、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNELの Schannel 固有のレジストリ キーに移動します。 詳細については、 TLS 1.2 へのアップグレード後の TLS 1.2 アップグレード ワークフロー と SSL エラーに関する記事を参照してください。
例: TLS 1.2 のクライアント ドライバーの最小バージョン
TLS 1.2 以降をネイティブにサポートするクライアント コンポーネントを使用します。 次のコンポーネントは、一般的な安全なベースラインです。
- SQL Server 用 Microsoft ODBC Driver 17 または 18
- Microsoft OLE DB Driver 18 または 19 for SQL Server。
- .NET Framework 4.6.2 以降、またはサポートされているバージョンの.NET (.NET 6 以降)。
- Microsoft JDBC Driver 9.4 以降。
レガシ SQL Server Native Client (SNAC) と、Windows (SQLOLEDB) に付属する SQL Server OLE DB プロバイダーは非推奨となりました。 それらを前の一覧のコンポーネントに置き換えます。
TLS プロトコルを照合するが、一致する暗号スイートがない
このシナリオは、ユーザーまたは管理者が、セキュリティを強化するためにクライアントまたはサーバー上の特定のアルゴリズムを制限する場合に発生します。
クライアントとサーバーの TLS バージョンと 暗号スイート は、ネットワーク トレースの Client Hello パケットと Server Hello パケットで確認できます。 クライアント Hello パケットはすべてのクライアント暗号スイートをアドバタイズし、サーバー Hello パケットはサーバーが選択した暗号スイートを返します。 一致するスイートがない場合、サーバーはサーバー Hello パケットを送信する代わりに接続を閉じます。
暗号スイートの不一致を修正する
この問題を調べるには、次の手順に従います。
ネットワーク トレースを使用できない場合は、次のレジストリ キーの下にある
Functions値を確認します:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002。次の PowerShell コマンドを使用して、構成された TLS 暗号スイートを一覧表示します。
Get-ItemPropertyValue -Path 'HKLM:\System\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' -Name FunctionsWindows 10、Windows 11、Windows Server 2016、以降では、
Get-TlsCipherSuiteを実行して、有効なスイートをより読みやすい形式で一覧表示することもできます。IIS 暗号化ツールの [暗号スイート] タブを使用して、一致するアルゴリズムがあるかどうかを確認します。 一致するアルゴリズムが見つからない場合は、Microsoft サポートにお問い合わせください。
詳細については、「 TLS 1.2 アップグレード ワークフロー および Transport Layer Security (TLS) 接続が失敗したり、再開を試みるときにタイムアウトしたりする可能性があるを参照してください。
異なる Windows バージョンで有効な TLS_DHE 暗号スイート
この問題は、クライアントとサーバーが異なるWindowsバージョン (Windows Server 2012以降など) で実行され、両方とも
TLS_DHE 暗号スイートを削除
この問題を解決するには、 TLS_DHE_ で始まるすべての暗号スイートをローカル ポリシーから削除します。 アプリケーションが Windows の SQL Server に接続しようとしたときに発生するエラーの詳細については、「 アプリケーションが Windows で SQL Server を接続するときに TLS 接続エラーが強制的に閉じられるを参照してください。
SQL Server 証明書は脆弱なハッシュ アルゴリズムを使用しています
SQL Server では、サインインに関連するネットワーク パケットが常に暗号化されます。 この目的のために、手動でプロビジョニングされた証明書または 自身が署名した証明書を使用します。 SQL Server証明書ストアでサーバー認証機能をサポートする証明書が見つかると、手動でプロビジョニングされていなくてもその証明書が使用されます。 証明書が MD5、SHA224、 SHA512 などの弱いハッシュ (拇印) アルゴリズムを使用している場合、TLS 1.2 では機能せず、エラーが発生します。
注記
自己署名証明書は、この問題の影響を受けません。
弱いハッシュ アルゴリズムを使用して証明書を置き換える、または再構成する
この問題を修正するには、次の手順に従ってください。
SQL Server 構成マネージャーで、Console ペインで SQL Server Network Configuration を展開します。
<インスタンス名のプロトコル>を選択します。
[ 証明書 ] タブを選択し、次のいずれかの操作を行います。
証明書が表示されたら、[ 表示 ] を選択して拇印アルゴリズムを確認し、弱いハッシュ アルゴリズムを使用しているかどうかを確認します。 次に、 Clear を選択し、手順 4 に進みます。
証明書が表示されない場合は、次のようなエントリのSQL Serverエラー ログを確認し、ハッシュまたは拇印の値をメモします。
2017-05-30 14:59:30.89 spid15s The certificate [Cert Hash(sha1) "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"] was successfully loaded for encryption
証明書からサーバー認証を削除します。
- Start>Run を選択し、「MMC (Microsoft 管理コンソール)」と入力します。
- MMC で、[ 証明書 ] スナップインを追加し、[ コンピューター アカウント] を選択します。
- [個人]>[証明書] を展開します。
- 名前または拇印で使用SQL Server証明書を見つけて、そのProperties ウィンドウを開きます。
- [ 全般 ] タブで、[ 次の目的のみを有効にする ] を選択し、[ サーバー認証] をオフにします。
SQL Server サービスを再起動します。
TLS_DHE先行ゼロ修正プログラムがインストールされていません
このシナリオは、クライアントとサーバーが TLS ハンドシェイク用に TLS_DHE_* 暗号スイートをネゴシエートするが、一方の側に、Diffie-Hellman キー交換の先行ゼロ修正を追加するWindows更新がない場合に発生します。 このシナリオの詳細については、「Windows で SQL サーバーに接続するときのアプリケーション エクスペリエンスによる TLS 接続の強制クローズ エラー」を参照してください。
注記
この記事で問題が解決しない場合は、接続に関する 一般的な問題に関する記事 が役立つかどうかを確認してください。
IOCP ワーカー不足による TCP 3 ウェイ ハンドシェイクのタイムアウト
SQL Server 2017 以前を実行している高負荷のシステムでは、TCP の 3 ウェイ ハンドシェイクの失敗が原因で断続的に 10054 エラーが発生し、その結果 TCP 接続の拒否が起こることがあります。 根本原因は、多くの場合、 TCPAcceptEx 要求の処理に遅延が発生します。 この遅延は、受信接続の受け入れを管理する 入出力完了ポート (IOCP) リスナー ワーカーの不足が原因で発生する可能性があります。 IOCP ワーカーが少なすぎる場合、または他の要求の処理がビジー状態の場合、接続要求は遅延処理され、ハンドシェイクエラーと TCP 拒否が発生します。 SSL ハンドシェイク中やサインイン要求の処理中に、認証チェックを含むサインイン タイムアウトが発生する場合もあります。
IOCPワーカー不足とハンドシェイクのタイムアウトを緩和する
IOCP ワーカーの不足と、認証および暗号化操作に割り当てられた SOS Worker リソースの不足が、これらの TCP 3 方向ハンドシェイク タイムアウトとサインイン タイムアウトの主な原因です。 SQL Server 2019 以降では、この領域のいくつかのパフォーマンス向上が含まれています。 注目すべき機能強化の 1 つは、サインイン タスクのリソース割り当てを最適化する専用ログイン ディスパッチャー プールです。 この変更により、タイムアウトが減少し、システム全体のパフォーマンスが向上します。 この問題の影響を受ける場合は、現在サポートされているSQL Serverバージョンへのアップグレードを計画してください。
その他の TLS 接続エラーのシナリオ
発生したエラー メッセージが上記のどのシナリオにも対応していない場合は、次の追加シナリオを参照してください。
- RSA 暗号化が使用されている場合、ローカル SQL Server はリンク サーバーに接続できません
- SQL Server のアップグレード後に接続エラー 10054 が発生する可能性がある
- SQL Server の Always On 環境にノードを追加するときに断続的な接続エラーが発生する
- SQLCMD ユーティリティの使用時に断続的な接続エラーが発生する
- SQL Server のエンドポイント 5022 でSSL_PE_NO_CIPHER エラーが発生する
- SQL Sever Agent SSIS エラーから発生0x80004005接続エラー
- SQL Server マシンに暗号スイート ポリシーを実装した後の "クライアントが接続を確立できません" エラー
- Windows Server を更新した後の "リンク サーバーへの接続に失敗しました" エラー
- SQL Server への接続中にSQL Server エージェントを開始できない
- SQL Server のリンク サーバー機能を使用して、より低いバージョンの SQL Server に接続中にエラーが発生しました
関連するコンテンツ
- SQL Server での接続に関する問題のトラブルシューティング
- 暗号化とネットワーク パケット サイズを使用するように構成された SQL サーバー上の SSIS パッケージのエラー
- 接続の問題をトラブルシューティングするための推奨される前提条件とチェックリスト
- TLS/SSL のプロトコル (Schannel SSP)
サードパーティの情報に関する免責事項
この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。