エラーの概要
.NET Framework 2.0で開発されたアプリケーションをSQL Server 2022に接続しようとすると、以下のエラーが発生する場合があります:
text
サーバーとの接続を正常に確立しましたが、ログイン前のハンドシェイク中にエラーが発生しました。 (プロバイダー: TCP プロバイダー、エラー: 0 - 既存の接続がリモート ホストによって強制的に閉じられました)。
エラーの根本原因
この問題は、主にTLS/暗号化プロトコルの互換性の問題によって発生します。
- SQL Server 2022:デフォルトで最新のTLS 1.2/1.3を要求
- .NET Framework 2.0:古いTLS 1.0またはSSL 3.0のみをサポート
このプロトコルの不一致により、暗号化ハンドシェイクが失敗し、接続がリモートホスト(SQL Server)によって閉じられます。
解決策
解決策1:接続文字列の調整(最初に試すべき方法)
接続文字列に以下のパラメータを追加してください:
xml
<connectionStrings> <add name="MyConnection" connectionString="Data Source=サーバー名;Initial Catalog=DB名;User ID=ユーザー名;Password=パスワード;Encrypt=false;TrustServerCertificate=true;Connection Timeout=30"/> </connectionStrings>
パラメータ説明:
Encrypt=false
:暗号化を無効化TrustServerCertificate=true
:サーバー証明書を検証しないConnection Timeout=30
:タイムアウト値の明示的設定
解決策2:クライアント側でのTLSプロトコル強制設定
アプリケーションの起動時(Main
メソッドやGlobal.asax
など)に以下のコードを追加します:
csharp
using System.Net; // アプリケーションの初期化処理で実行 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // もし上記で解決しない場合、複数のプロトコルを指定 // ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
注意点: .NET Framework 2.0ではTls12
定数が存在しない場合があります。その場合は数値で直接指定してください:
csharp
ServicePointManager.SecurityProtocol = (SecurityProtocolType)0x00000C00;
解決策3:SQL Server側の設定変更
混合モード暗号化の有効化
- SQL Server構成マネージャーを開く
- 「SQL Serverネットワークの構成」→「[インスタンス名]のプロトコル」を選択
- 「プロトコルのプロパティ」→「フラグ」タブで以下の設定:
- ForceEncryption:「いいえ」に設定
旧版TLSプロトコルのサポート確保
Windows Serverで古いTLSバージョン(TLS 1.0/1.1)が有効になっていることを確認してください。
解決策4:.NET Frameworkのバージョンアップ(推奨)
長期的な解決策として、アプリケーションを.NET Framework 4.6.2以上にアップグレードすることを強く推奨します。
- .NET Framework 4.5以上ではTLS 1.2がネイティブサポート
- セキュリティ面でも大幅に改善
- マイクロソフトの公式サポート対象
解決策5:ネットワーク環境の確認
- ファイアウォール設定:ポート1433(既定)が開放されているか確認
- ネットワーク接続:不安定なネットワーク環境ではないか確認
- 別クライアントからの接続テスト:他のマシンから接続可能か確認
トラブルシューティング手順
- 接続文字列の基本確認:
- サーバー名、認証情報が正しいか
- 基本的な接続が確立できるか確認
- 段階的な設定適用:
- 解決策1→解決策2の順で試す
- 設定変更後の動作確認
- SQL Serverエラーログの確認:
- SQL Serverのエラーログに詳細なエラー情報がないか確認
- ネットワークトレースの取得:
- ネットワークレベルでの接続問題を調査
まとめ
この接続問題は、新旧テクノロジー間のセキュリティプロトコルギャップが主な原因です。解決策1と2の組み合わせで大部分のケースが解決しますが、セキュリティと将来性を考慮すると、解決策4の.NET Frameworkバージョンアップが最も堅牢な解決策となります。
アプリケーションの改修が難しい場合は、一時的な対策として接続文字列の調整とTLS設定の適用で対応し、中長期的な移行計画を立てることをお勧めします。
コメントなし