既存の接続がリモート ホストによって強制的に閉じられました (OS エラー 10054)

適用対象: 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 プロトコルの現在のサポート状態については、「 TLS/SSL (Schannel SSP)

環境内で適用されるシナリオを特定する

次のセクションでは、ハンドシェイクが失敗する可能性があるさまざまなシナリオについて説明します。 環境に一致するものがわからない場合は、次の開始点を使用して絞り込みます。

  • 接続の失敗中にクライアントとサーバーでネットワーク トレースをキャプチャします。 次に、 クライアント Hello パケットと サーバー Hello パケットを調べて、ネゴシエートされた TLS バージョンと暗号スイートを確認します。
  • successfully loaded for encryption エントリのSQL Server エラー ログを調べて、使用されている証明書を確認します。 拇印アルゴリズムを確認します。
  • Get-TlsCipherSuiteHKEY_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 を一時的に有効にするようにシステム管理者に依頼します。 これは、コンポーネントをアップグレードできるまで行います。 次のいずれかのアクションを使用します。

例: 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 パケットを送信する代わりに接続を閉じます。

暗号スイートの不一致を修正する

この問題を調べるには、次の手順に従います。

  1. ネットワーク トレースを使用できない場合は、次のレジストリ キーの下にある 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 Functions
    

    Windows 10、Windows 11、Windows Server 2016、以降では、Get-TlsCipherSuite を実行して、有効なスイートをより読みやすい形式で一覧表示することもできます。

  2. IIS 暗号化ツールの [暗号スイート] タブを使用して、一致するアルゴリズムがあるかどうかを確認します。 一致するアルゴリズムが見つからない場合は、Microsoft サポートにお問い合わせください。

詳細については、「 TLS 1.2 アップグレード ワークフロー および Transport Layer Security (TLS) 接続が失敗したり、再開を試みるときにタイムアウトしたりする可能性があるを参照してください。

異なる Windows バージョンで有効な TLS_DHE 暗号スイート

この問題は、クライアントとサーバーが異なるWindowsバージョン (Windows Server 2012以降など) で実行され、両方とも 暗号スイートをアドバタイズする場合に発生する可能性があります。 これらのWindowsバージョンでは、TLS 内 Diffie-Hellman キー交換が異なる方法で処理されるため、ハンドシェイクが失敗する可能性があります。

TLS_DHE 暗号スイートを削除

この問題を解決するには、 TLS_DHE_ で始まるすべての暗号スイートをローカル ポリシーから削除します。 アプリケーションが Windows の SQL Server に接続しようとしたときに発生するエラーの詳細については、「 アプリケーションが Windows で SQL Server を接続するときに TLS 接続エラーが強制的に閉じられるを参照してください。

SQL Server 証明書は脆弱なハッシュ アルゴリズムを使用しています

SQL Server では、サインインに関連するネットワーク パケットが常に暗号化されます。 この目的のために、手動でプロビジョニングされた証明書または 自身が署名した証明書を使用します。 SQL Server証明書ストアでサーバー認証機能をサポートする証明書が見つかると、手動でプロビジョニングされていなくてもその証明書が使用されます。 証明書が MD5、SHA224、 SHA512 などの弱いハッシュ (拇印) アルゴリズムを使用している場合、TLS 1.2 では機能せず、エラーが発生します。

注記

自己署名証明書は、この問題の影響を受けません。

弱いハッシュ アルゴリズムを使用して証明書を置き換える、または再構成する

この問題を修正するには、次の手順に従ってください。

  1. SQL Server 構成マネージャーで、Console ペインで SQL Server Network Configuration を展開します。

  2. <インスタンス名のプロトコル>を選択します。

  3. [ 証明書 ] タブを選択し、次のいずれかの操作を行います。

    • 証明書が表示されたら、[ 表示 ] を選択して拇印アルゴリズムを確認し、弱いハッシュ アルゴリズムを使用しているかどうかを確認します。 次に、 Clear を選択し、手順 4 に進みます。

    • 証明書が表示されない場合は、次のようなエントリのSQL Serverエラー ログを確認し、ハッシュまたは拇印の値をメモします。

      2017-05-30 14:59:30.89 spid15s The certificate [Cert Hash(sha1) "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"] was successfully loaded for encryption

  4. 証明書からサーバー認証を削除します。

    1. Start>Run を選択し、「MMC (Microsoft 管理コンソール)」と入力します。
    2. MMC で、[ 証明書 ] スナップインを追加し、[ コンピューター アカウント] を選択します。
    3. [個人]>[証明書] を展開します。
    4. 名前または拇印で使用SQL Server証明書を見つけて、そのProperties ウィンドウを開きます。
    5. [ 全般 ] タブで、[ 次の目的のみを有効にする ] を選択し、[ サーバー認証] をオフにします。
  5. 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 接続エラーのシナリオ

発生したエラー メッセージが上記のどのシナリオにも対応していない場合は、次の追加シナリオを参照してください。

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。