Azure SQLで「An existing connection was forcibly closed」OS error 10054が出る原因と対処法

Azure SQLへの接続時に「An existing connection was forcibly closed by the remote host」「OS error 10054」が出る場合、最初に疑うべきは単なるネットワーク断ではなく、TLSハンドシェイクの失敗です。特に、古いSQL Serverドライバー、TLS 1.0/1.1に依存したクライアント、暗号スイートの制限、証明書検証の設定変更が絡むと、ログイン前後で接続が強制的に切断されたように見えます。

2026年5月下旬に更新されたMicrosoft公式のトラブルシューティング情報では、このエラーを「クライアントとSQL Server側でTLSプロトコルや暗号スイートに合意できない状態」として整理しています。Azure SQLを利用している管理者・開発者は、Azure SQL側の最小TLSバージョン、クライアントドライバー、接続文字列、OSのSchannel設定、展開手順をセットで確認することが重要です。(Microsoft Learn)

目次

Azure SQLでOS error 10054が出るときに起きていること

「An existing connection was forcibly closed by the remote host」は、直訳すると「既存の接続がリモートホストによって強制的に閉じられた」という意味です。SQL Server接続では、次のようなメッセージとして表示されることがあります。

A connection was successfully established with the server,
but then an error occurred during the login process.
(provider: SSL Provider, error: 0 -
An existing connection was forcibly closed by the remote host.)
A connection was successfully established with the server,
but then an error occurred during the pre-login handshake.
(provider: TCP Provider, error: 0 -
An existing connection was forcibly closed by the remote host.)

ポイントは、TCP接続そのものは一度成立しているように見えることです。その後、ログイン処理やpre-login handshakeの段階でTLSの合意に失敗すると、クライアント側では「接続が強制終了された」と見えます。Microsoftの公式情報でも、OS error 10054はWindows sockets層で発生するエラーとして説明されています。(Microsoft Learn)

そのため、Azure SQLでこのエラーが出たときに「ファイアウォールだけ」を見ても原因にたどり着けないことがあります。実務では、次の順番で切り分けると効率的です。

優先度確認対象見るべきポイント
クライアントドライバーODBC、OLE DB、JDBC、.NET SqlClientがTLS 1.2以上に対応しているか
Azure SQLの最小TLS設定最小TLSバージョンがクライアントより高くないか
接続文字列EncryptTrustServerCertificate、証明書名検証の指定
OSのTLS設定Schannel、グループポリシー、暗号スイート制限
ネットワーク経路Public Endpoint、Private Endpoint、Proxy/Redirect接続ポリシー
低〜中SQL Server側の証明書Managed InstanceやSQL Server on Azure VMで証明書を管理している場合

今回の公式情報で押さえるべき変更点

今回の更新で重要なのは、新しいエラーコードが追加されたことではありません。OS error 10054を「TLSハンドシェイク失敗」として体系的に切り分ける観点が明確になったことです。

Microsoftの公式情報では、主な原因として次のようなシナリオが整理されています。

原因具体例対応の方向性
TLSプロトコルの不一致クライアントがTLS 1.0/1.1しか使えず、サーバー側はTLS 1.2以上を要求ドライバー、ランタイム、OSを更新
暗号スイートの不一致セキュリティ強化で利用可能な暗号スイートを絞りすぎたクライアントとサーバーで共通の暗号スイートを確認
TLS_DHE_*暗号スイートの問題異なるWindows Server世代間でDHE系スイートの扱いが合わないTLS_DHE_*の利用状況を確認し、必要に応じて無効化
弱いハッシュアルゴリズムの証明書MD5など、TLS 1.2で問題になる証明書を使用証明書の置き換え、用途設定の見直し
古いクライアントコンポーネントSQL Server Native Client、古いODBC/OLE DB/JDBC現行ドライバーへ移行

Microsoftは、TLS 1.2以上を扱うための一般的な安全ラインとして、Microsoft ODBC Driver 17/18、Microsoft OLE DB Driver 18/19、.NET Framework 4.6.2以降またはサポート中の.NET、Microsoft JDBC Driver 9.4以降などを挙げています。一方で、SQL Server Native Clientや古いSQLOLEDBは非推奨のため、Azure SQL接続では移行対象として扱うべきです。(Microsoft Learn)

Azure SQLで影響を受けやすい環境

Azure SQL DatabaseやAzure SQL Managed Instanceを使っている場合、影響を受けやすいのは「データベース本体」よりも、そこへ接続するクライアント側です。特に次の環境では、OS error 10054が発生しやすくなります。

環境影響を受けやすい理由
古い業務アプリ同梱ドライバーがTLS 1.2に未対応、または設定変更できない場合がある
古いWindows Server上のバッチSchannel設定や.NET Frameworkが古い可能性がある
SSIS、ETL、BIツール内部で使うSQL Serverドライバーが古いことがある
JavaアプリJVM、JDBC Driver、trustStore設定の組み合わせで失敗することがある
Python、PHP、Node.jsアプリ実際にはODBCドライバー経由で接続している場合がある
セキュリティ強化済み端末GPOやEDR方針で暗号スイートが制限されていることがある
Private Endpoint移行中の環境ネットワーク経路変更とTLSエラーが同時期に発生し、原因を誤認しやすい

Azure SQLでは、TLS 1.0/1.1の扱いにも注意が必要です。Azure SQL Databaseの接続設定では、現在サポートされる最小TLSバージョンはTLS 1.2とされ、TLS 1.0/1.1は廃止済みとして扱われます。また、最小TLSバージョンを設定すると、そのサーバーに関連付くデータベースへの接続に影響します。(Microsoft Learn)

Azure SQL Managed Instanceでも、最小TLSバージョン1.2が適用され、TLS 1.2以上の接続のみが受け入れられると説明されています。古いクライアントライブラリやフレームワークがTLS 1.2をサポートしていない場合、接続は失敗します。(Microsoft Learn)

管理者が最初に確認すべきAzure SQL側の設定

最小TLSバージョンを確認する

Azure SQL Databaseでは、論理サーバーの接続設定から最小TLSバージョンを確認します。Azure portalでは、対象のSQL論理サーバーを開き、Security配下のNetworkingからConnectivityタブを確認します。

Azure CLIで確認する場合は、次のように実行します。

az sql server show \
  -n <sql-server-name> \
  -g <resource-group-name> \
  --query "minimalTlsVersion"

TLS 1.2に設定する場合は、事前に検証環境で接続確認を済ませたうえで、次のように更新します。

az sql server update \
  -n <sql-server-name> \
  -g <resource-group-name> \
  --set minimalTlsVersion="1.2"

最小TLSバージョンの設定は、適用後すぐに接続へ影響します。要件を満たさないクライアントが残っていると、業務アプリやバッチが突然接続できなくなる可能性があります。Microsoftの接続設定ドキュメントでも、接続関連の設定は適用後すぐに有効になり、条件を満たさない場合は接続が失われる可能性があると説明されています。(Microsoft Learn)

TLS 1.0/1.1で接続しているクライアントを洗い出す

Azure SQLの設定を変える前に、まず古いTLSで接続しているクライアントを特定します。Azure portalのメトリックでSuccessful connectionsを確認し、TLSバージョンでフィルターする方法があります。また、SQL監査ログを有効にして、client_tls_version_nameを確認する方法もあります。(Microsoft Learn)

確認すべき項目は次の通りです。

確認項目判断基準
TLS 1.0/1.1の接続があるか1件でもあれば、該当クライアントを移行対象にする
接続元IPアプリサーバー、運用端末、ETLサーバーを特定する
ホスト名・アプリ名ログに出る場合は担当チームへ確認する
接続頻度月次・日次バッチなど、常時接続でない処理も見落とさない
失敗時刻リリース、OS更新、ドライバー更新、GPO変更と照合する

よくある失敗は、Webアプリだけを確認して、運用端末のSSMS、古い帳票ツール、月末バッチを見落とすことです。TLS移行では「常時稼働アプリ」よりも「たまに動くジョブ」が本番障害の原因になりやすいため、監査ログの期間は最低でも業務サイクルを1周できる長さで見るのが安全です。

開発者が確認すべきドライバーと接続文字列

ドライバーは「動いているから安全」と判断しない

Azure SQL接続では、アプリケーションコードよりもドライバーの古さが問題になることがあります。たとえば、アプリ側では同じ接続文字列を使っていても、実行環境にインストールされているODBC DriverやJDBC Driverが変わるだけで挙動が変わります。

最低限、次の観点で棚卸ししてください。

言語・環境確認するもの推奨アクション
.NET / C#Microsoft.Data.SqlClient、System.Data.SqlClient、.NET Frameworkサポート中の.NETまたは.NET Framework 4.6.2以降を基準に見直す
C++ / Python / PHPODBC Driver for SQL ServerODBC Driver 17/18以降を候補にする
COM / 古いWindowsアプリOLE DB ProviderMSOLEDBSQL 18/19へ移行を検討する
JavaMicrosoft JDBC Driver for SQL Server、JVMJDBC Driver 9.4以降、JVMのTLS設定、trustStoreを確認する
レガシーアプリSQL Server Native Client、SQLOLEDB非推奨のため置き換えを計画する

Microsoft公式情報では、SQL Server Native Clientと、Windowsに同梱されていた古いSQL Server OLE DB Providerは非推奨とされています。Azure SQLへの長期接続を維持するなら、「エラーが出たら対処」ではなく、計画的に現行ドライバーへ置き換えるべきです。(Microsoft Learn)

接続文字列はEncryptとTrustServerCertificateを明示する

Azure SQLでは、Microsoftが提供またはサポートするドライバーでTLSが使われます。Microsoftは、Azure SQL DatabaseやAzure SQL Managed Instanceへの接続では、Encrypt = OnTrustServerCertificate = Off、必要に応じてHostNameInCertificate相当の設定を使うことを推奨しています。これにより、クライアントドライバーがサーバー証明書のIDを検証できます。(Microsoft Learn)

ADO.NETの例は次の通りです。

Server=tcp:<server-name>.database.windows.net,1433;
Database=<database-name>;
Authentication=Active Directory Default;
Encrypt=True;
TrustServerCertificate=False;

JDBCで証明書名を明示したい場合は、環境に応じて次のような指定を検討します。

jdbc:sqlserver://<server-name>.database.windows.net:1433;
database=<database-name>;
encrypt=true;
trustServerCertificate=false;
hostNameInCertificate=*.database.windows.net;

本番環境では、安易にTrustServerCertificate=Trueへ逃げないことが重要です。この設定は証明書検証を省略するため、検証目的の一時回避には使えても、恒久対策としては推奨しにくい設定です。JDBC Driverの公式ドキュメントでも、trustServerCertificate=trueはサーバーTLS証明書を検証しない設定として説明されています。(Microsoft Learn)

ドライバー更新後の「証明書チェーンが信頼されない」に注意する

ODBC Driver 18やOLE DB Driver 19へ更新した後、OS error 10054とは別に、証明書チェーンの信頼エラーが出ることがあります。これは、古いドライバーでは暗号化が既定で無効だったのに対し、新しいドライバーでは暗号化や証明書検証が既定で有効になり、これまで見えていなかった証明書設定の問題が表面化するためです。(Microsoft Learn)

この場合、やるべきことは「暗号化を無効にする」ではなく、次の順で確認することです。

確認項目対応
接続先ホスト名Azure SQLのFQDNで接続しているか確認する
証明書名検証HostNameInCertificateが必要か確認する
ルート証明書クライアントOSやコンテナイメージのCA証明書を更新する
ドライバー設定EncryptTrustServerCertificateを明示する
一時回避検証環境のみ、期限付きでTrustServerCertificate=Trueを検討する

TLSプロトコルと暗号スイートの切り分け方法

クライアント側でTLS 1.2以上が有効か確認する

WindowsクライアントやWindows Serverでは、Schannelの設定やグループポリシーでTLSバージョンが制限されていることがあります。特に、古いOSを長く使っている環境や、セキュリティ基準に合わせて暗号スイートを独自に絞っている環境では注意が必要です。

Windowsでは、暗号スイートを次のPowerShellで確認できます。

Get-TlsCipherSuite

レジストリで確認する場合は、主に次の配下を確認します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

Microsoft公式情報でも、Get-TlsCipherSuiteやSchannel配下のレジストリキーを使って、クライアントとサーバーのTLSバージョン・暗号スイートを比較する方法が案内されています。(Microsoft Learn)

Azure SQL Databaseでは利用者がサーバー側OSへ直接入ってパケットキャプチャを取ることはできません。そのため、実務では次の情報を組み合わせます。

  • クライアント側のネットワークトレース
  • アプリケーションログ
  • Azure SQLのメトリック
  • SQL監査ログ
  • ドライバーの詳細ログ
  • OS更新履歴、GPO変更履歴
  • リリース時刻と失敗時刻の照合

「Client Hello」と「Server Hello」を見る

ネットワークトレースを取れる場合は、TLSのClient HelloServer Helloを確認します。

パケット見る内容判断
Client Helloクライアントが提示したTLSバージョン、暗号スイート古いTLSや弱い暗号スイートしか出していない場合はクライアント側が原因
Server Helloサーバーが選択したTLSバージョン、暗号スイート返ってこない場合は合意できず切断された可能性
Alerthandshake failureなどTLS交渉失敗の裏付けになる

暗号スイートの不一致では、クライアントが提示した候補とサーバー側が受け入れられる候補に共通点がなく、接続が閉じられます。Microsoft公式情報でも、Client HelloとServer Helloを確認して、TLSバージョンと暗号スイートを調べる方法が示されています。(Microsoft Learn)

Azure SQLのネットワーク設定とTLSエラーを混同しない

OS error 10054はTLSが原因で起きることが多い一方、Azure SQLのネットワーク設定変更と同時に発生すると、原因を誤認しやすくなります。

たとえば、次の変更を同じ日に実施すると、どれが原因か分からなくなります。

同時にやりがちな変更切り分けが難しくなる理由
Private Endpoint化DNS、ルーティング、証明書名検証が同時に変わる
最小TLSバージョン変更古いクライアントだけが失敗し始める
ODBC Driver 18導入暗号化と証明書検証の既定動作が変わる
Redirect接続ポリシーへ変更必要なアウトバウンド許可ポートが変わる
OSセキュリティ基準の適用TLSプロトコルや暗号スイートが制限される

Azure SQL Databaseの接続アーキテクチャでは、クライアントはまずポート1433でゲートウェイへ接続し、接続ポリシーに応じてProxyまたはRedirectでトラフィックが転送されます。Redirectは低遅延・高スループットのため推奨されますが、11000〜11999番ポートなど追加のアウトバウンド許可が必要になる場合があります。(Microsoft Learn)

したがって、ネットワーク変更とTLS変更は同時に実施しない方が安全です。どうしても同時に行う場合は、検証環境で次の組み合わせを再現してください。

再現条件確認内容
本番と同じOSSchannel、CA証明書、GPOが同じか
本番と同じドライバーODBC/JDBC/.NETのバージョンが同じか
本番と同じ接続経路Public Endpoint、Private Endpoint、Proxy/Redirectを合わせる
本番と同じ認証方式SQL認証、Microsoft Entra ID認証、Managed Identityを合わせる
本番と同じ接続文字列EncryptTrustServerCertificateの差分をなくす

移行・展開時の実践手順

Azure SQLのOS error 10054対策は、設定を1つ変えて終わりではありません。安全に進めるなら、次の順番で実施します。

手順作業完了条件
1接続元を棚卸しするアプリ、バッチ、ETL、運用端末、BIツールを一覧化
2TLS 1.0/1.1利用を確認するメトリックまたは監査ログで古いTLS接続を特定
3ドライバーを更新するTLS 1.2以上対応のドライバーへ移行
4接続文字列を明示するEncrypt=TrueTrustServerCertificate=Falseを基準化
5検証環境で最小TLSを上げる主要処理と月次・日次ジョブが成功
6本番へ段階展開する監視を有効化し、失敗接続を即時確認
7古い設定を撤去する一時回避のTrustServerCertificate=Trueや古いドライバーを残さない

特に重要なのは、最小TLSバージョンの変更前にクライアント側を直すことです。Azure SQL側で先にTLS 1.2以上を強制すると、古いクライアントは接続できなくなり、アプリ側からはOS error 10054やログイン失敗として見える可能性があります。

よくある失敗と回避策

SSMSでは接続できるのにアプリだけ失敗する

SSMSが新しいドライバーや新しい.NET環境を使っている一方で、アプリは古いODBC DriverやSQL Server Native Clientを使っていることがあります。この場合、SSMSの成功は本番アプリの安全性を保証しません。

確認すべきなのは、実際にアプリプロセスがロードしているドライバーです。WindowsならODBCデータソースアドミニストレーター、アプリのログ、インストール済みドライバー一覧を確認してください。

開発環境では動くのに本番だけ失敗する

本番だけ失敗する場合は、OSのTLS設定、グループポリシー、プロキシ、EDR、ファイアウォール、証明書ストアの差分が原因になりがちです。DockerコンテナやLinux環境では、ベースイメージのCA証明書が古いこともあります。

この場合、接続文字列だけを見ても解決しません。OSイメージ、証明書ストア、JVM、OpenSSL、ODBC Driverのバージョンを本番と開発で比較してください。

TrustServerCertificate=Trueで直ったので完了にしてしまう

TrustServerCertificate=Trueで接続できるようになる場合、原因はTLSプロトコルではなく証明書検証にある可能性があります。ただし、この設定は証明書検証を省略するため、本番の恒久対策としては避けるべきです。

正しい対応は、接続先ホスト名、証明書の信頼チェーン、HostNameInCertificate、CA証明書を整えることです。検証を省く設定は、切り分け用の一時対応として期限を決めて使いましょう。

TLS 1.3を急いで強制する

TLS 1.3は新しい選択肢ですが、すべてのOSやドライバーが同じように対応しているわけではありません。Azure SQL Databaseの接続設定ドキュメントでも、TLS 1.3の強制は、TLS 1.3をサポートしないクライアントで問題を起こす可能性があると注意されています。(Microsoft Learn)

実務では、まずTLS 1.2を安定した基準にし、すべてのクライアントと監視体制が整ってからTLS 1.3を検討する方が安全です。

Azure SQL管理者・開発者向けチェックリスト

最後に、OS error 10054が出たときに確認すべき項目をまとめます。

役割チェック項目判断基準
管理者Azure SQLの最小TLS設定TLS 1.2以上を前提に、変更前に影響調査済みか
管理者監査ログ・メトリックTLS 1.0/1.1の接続元を特定できているか
管理者ネットワーク設定Public/Private Endpoint、Proxy/Redirect、アウトバウンド許可を確認済みか
開発者ドライバーODBC、OLE DB、JDBC、SqlClientが古くないか
開発者接続文字列EncryptTrustServerCertificateを明示しているか
開発者証明書検証ホスト名、CA証明書、trustStoreを確認済みか
運用担当展開順序ドライバー更新後にTLS設定を変更する順番になっているか
運用担当ロールバック一時回避策と恒久対策を分けているか

まずやるべきこと

Azure SQLで「An existing connection was forcibly closed」「OS error 10054」が出たら、まず次の3つを実施してください。

  • Azure SQLのメトリックまたは監査ログで、TLS 1.0/1.1を使う接続元がないか確認する
  • 該当アプリのSQL Serverドライバー、.NET/JVM/ODBC/OLE DBのバージョンを棚卸しする
  • 接続文字列でEncrypt=TrueTrustServerCertificate=Falseを基準にし、証明書検証エラーが出る場合は証明書・ホスト名・CAストアを直す

このエラーは、ネットワーク担当、DBA、アプリ開発者のどこか1チームだけでは解決しにくい問題です。Azure SQL側の最小TLSバージョン、クライアントドライバー、OSのTLS設定、接続文字列を1枚の一覧にまとめ、古いクライアントから順に潰していくのが最短ルートです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次