Categories:

エラーの概要

.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側の設定変更

混合モード暗号化の有効化

  1. SQL Server構成マネージャーを開く
  2. 「SQL Serverネットワークの構成」→「[インスタンス名]のプロトコル」を選択
  3. 「プロトコルのプロパティ」→「フラグ」タブで以下の設定:
    • 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:ネットワーク環境の確認

  1. ファイアウォール設定:ポート1433(既定)が開放されているか確認
  2. ネットワーク接続:不安定なネットワーク環境ではないか確認
  3. 別クライアントからの接続テスト:他のマシンから接続可能か確認

トラブルシューティング手順

  1. 接続文字列の基本確認
    • サーバー名、認証情報が正しいか
    • 基本的な接続が確立できるか確認
  2. 段階的な設定適用
    • 解決策1→解決策2の順で試す
    • 設定変更後の動作確認
  3. SQL Serverエラーログの確認
    • SQL Serverのエラーログに詳細なエラー情報がないか確認
  4. ネットワークトレースの取得
    • ネットワークレベルでの接続問題を調査

まとめ

この接続問題は、新旧テクノロジー間のセキュリティプロトコルギャップが主な原因です。解決策1と2の組み合わせで大部分のケースが解決しますが、セキュリティと将来性を考慮すると、解決策4の.NET Frameworkバージョンアップが最も堅牢な解決策となります。

アプリケーションの改修が難しい場合は、一時的な対策として接続文字列の調整とTLS設定の適用で対応し、中長期的な移行計画を立てることをお勧めします。

コメントなし

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です