暗号化のサポートについて

JDBC ドライバーのダウンロード

SQL Server に接続する際、アプリケーションによって暗号化が要求され、なおかつ、SQL Server のインスタンスで TLS 暗号化がサポートされる構成になっていた場合、SQL Server 用 Microsoft JDBC ドライバー では TLS ハンドシェイクが開始されます。 サーバーとクライアントは、このハンドシェイクによって、データの保護に使用する暗号化と暗号アルゴリズムをネゴシエートします。 TLS ハンドシェイクが完了すると、暗号化されたデータを安全に送信できるようになります。 サーバーでは、TLS ハンドシェイクの際にクライアントに公開キー証明書が送信されます。 公開キー証明書の発行者は証明機関 (CA) と呼ばれます。 その証明機関が、クライアントが信頼するいずれかの証明機関に該当するかどうかは、クライアント側で検証する必要があります。

アプリケーションから暗号化を要求されなかった場合、SQL Server は、TLS 暗号化をサポートするよう SQL Server 用 Microsoft JDBC ドライバー によって強制されることはありません。 SQL Server インスタンスが TLS 暗号化を強制的に使用するように構成されていない場合、接続は暗号化なしで確立されます。 SQL Server インスタンスが TLS 暗号化を強制的に使用するように構成されている場合は、使用中の Java 仮想マシン (JVM) が正常に構成されていれば自動的に TLS 暗号化が有効になり、そうでなければ接続が終了してエラーが生成されます。

Note

TLS 接続に成功するためには、serverName に渡された値が、サーバー証明書に含まれる Subject Alternate Name (SAN) の Common Name (CN) または DNS 名と厳密に一致している必要があります。

SQL Server 用に TLS を構成する方法の詳細については、「データベース エンジンへの暗号化接続の有効化」を参照してください。

解説

TLS 暗号化をアプリケーションで使用できるようにするために、SQL Server 用 Microsoft JDBC ドライバー のバージョン 1.2 リリース以降では、encrypttrustServerCertificatetrustStoretrustStorePasswordhostNameInCertificate の各接続プロパティが導入されました。 ドライバーが TLS 暗号化で TDS 8.0 を使用できるように、バージョン 11.2 リリース以降では、接続プロパティ serverCertificate が導入されました。 詳細については、「接続プロパティの設定」を参照してください。

次の表は、想定される TLS 接続シナリオでの SQL Server 用 Microsoft JDBC ドライバー バージョンの動作をまとめたものです。 使用する TLS 接続プロパティの組み合わせをシナリオごとに変えています。 表の値の意味を以下に示します。

  • blank: "接続文字列にプロパティが存在しない"
  • value:"接続文字列にプロパティが存在し、その値が有効である"
  • any: "接続文字列にプロパティが存在するかどうか、またはその値が有効であるかどうかは関係ない"

Note

SQL Server ユーザー認証でも Windows 統合認証でも同じ動作になります。

プロパティの設定 動作
encrypt = false または blank
trustServerCertificate = any
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
ドライバーによって、TLS 暗号化のサポートはサーバーに強制されません。 サーバーに自己署名証明書が存在する場合、その TLS 証明書の交換がドライバーによって開始されます。 TLS 証明書の検証は行われず、(ログイン パケット内の) 資格情報のみが暗号化されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合は、TLS 証明書の交換が開始されます。 TLS 証明書の検証は行われませんが、通信全体が暗号化されます。
encrypt = true
trustServerCertificate = true
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。 trustServerCertificate プロパティが "true" に設定されている場合、TLS 証明書は検証されません。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = blank
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーにより、接続 URL に指定されている serverName プロパティを使用してサーバーの TLS 証明書が検証され、信頼マネージャー ファクトリの検索ルールに従って、使用する証明書ストアが決定されます。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーにより、hostNameInCertificate プロパティに指定されている値を使用して、TLS 証明書のサブジェクトの値が検証されます。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = value
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーは、trustStore プロパティの値を使用して証明書の trustStore ファイルを検索し、trustStorePassword プロパティの値を使用して trustStore ファイルの整合性をチェックします。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = value
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーは、trustStorePassword プロパティの値を使用して、既定の trustStore ファイルの整合性をチェックします。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = blank
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーは、trustStore プロパティの値を使用して、trustStore ファイルの場所を調べます。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = value
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーは、trustStorePassword プロパティの値を使用して、既定の trustStore ファイルの整合性をチェックします。 また、hostNameInCertificate プロパティの値を使用して、TLS 証明書が検証されます。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = blank
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーは、trustStore プロパティの値を使用して、trustStore ファイルの場所を調べます。 また、hostNameInCertificate プロパティの値を使用して、TLS 証明書が検証されます。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = true
trustServerCertificate = false または blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = value
ドライバーによって、サーバーに TLS 暗号化を使用するように要求されます。

サーバーによってクライアントに TLS 暗号化のサポートが要求されている場合、またはサーバーで暗号化がサポートされている場合、ドライバーによって TLS 証明書の交換が開始されます。

ドライバーは、trustStore プロパティの値を使用して証明書の trustStore ファイルを検索し、trustStorePassword プロパティの値を使用して trustStore ファイルの整合性をチェックします。 また、hostNameInCertificate プロパティの値を使用して、TLS 証明書が検証されます。

サーバーが暗号化をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。
encrypt = strict
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
serverCertificate = value
ドライバーによって、サーバーで TDS 8.0 strict TLS 暗号化を使用するように要求されます。

ドライバーは、最初のアクションとして、サーバーとの TLS ハンドシェイクと証明書交換を開始します。

trustServerCertificate 設定は無視され、strict モードでは false として扱われます。

ドライバーは、オプションの hostNameInCertificate または serverCertificate プロパティを使用して、サーバー TLS 証明書を検証します。

サーバーが TDS 8 接続をサポートするように構成されていない場合、ドライバーはエラーを生成して接続を終了します。

encrypt プロパティが true に設定されている場合、SQL Server 用 Microsoft JDBC ドライバー では、JVM の既定の JSSE セキュリティ プロバイダーを使用して、SQL Server と TLS 暗号化がネゴシエートされます。 既定のセキュリティ プロバイダーでは、TLS 暗号化の正常なネゴシエートに必要なすべての機能がサポートされているとは限りません。 たとえば、既定のセキュリティ プロバイダーでは、SQL Server の TLS 証明書で使用されている RSA 公開キーのサイズがサポートされていない場合があります。 この場合、既定のセキュリティ プロバイダーでエラーが発生し、その結果 JDBC ドライバーが接続を終了する可能性があります。 この問題を解決するには、次のオプションのいずれかを使用できます。

  • サイズの小さい RSA 公開キーを持つサーバー証明書を使用して、SQL Server を構成します。
  • "<java-home>/lib/security/java.security" セキュリティ プロパティ ファイルで、別の JSSE セキュリティ プロバイダーを使用するように JVM を構成します。
  • 別の JVM を使用します。

サーバーの TLS 証明書の検証

サーバーでは、TLS ハンドシェイクの際にクライアントに公開キー証明書が送信されます。 そのサーバー証明書が、クライアントが信頼している証明機関によって発行されているかどうかを、JDBC ドライバーまたはクライアント側が検証する必要があります。 ドライバーにより、サーバー証明書で次の条件が満たされていることが要求されます。

  • 信頼されている証明機関から発行されている。
  • サーバー認証用に証明書が発行されている。
  • 証明書が期限切れではない。
  • 証明書の Subject の Common Name (CN) または Subject Alternate Name (SAN) の DNS 名が、接続文字列に指定された serverName の値 (または hostNameInCertificate プロパティの値が指定されている場合はその値) と厳密に一致している。
  • DNS 名にはワイルドカード文字を含めることができます。 7\.2 よりも前のバージョンでは、SQL Server 用 Microsoft JDBC ドライバー でワイルドカードでのマッチングがサポートされません。 つまり、abc.com は *.com とは一致せず、*.com は *.com と一致します。 バージョン 7.2 以降では、標準証明書のワイルドカードでのマッチングがサポートされています。

TDS 8.0 と strict 暗号化を使用する場合、serverCertificate プロパティ値が、サーバー証明書の検証に使用するサーバー証明書へのパスになります。 このファイルは PEM ファイル形式を使用する必要があります。 サーバーから受け取った証明書は、この証明書と正確に一致している必要があります。

関連項目

暗号化の使用
JDBC ドライバー アプリケーションのセキュリティ保護