SSL のサポートについて
SQL Server に接続する際に、アプリケーションが暗号化を要求した場合、SQL Server のインスタンスが SSL 暗号化をサポートするように構成されていれば、Microsoft SQL Server JDBC Driver は SSL ハンドシェイクを開始します。これにより、サーバーとクライアントが、データを保護するために使用する暗号化アルゴリズムのネゴシエートを行うことができます。SSL ハンドシェイクが完了すると、暗号化されたデータを安全に送信できるようになります。サーバーは、SSL ハンドシェイクの際にクライアントに公開キー証明書を送信します。公開キー証明書の発行者は証明機関 (CA) と呼ばれます。クライアントは、その証明機関が信頼されている証明機関かどうかを検証する必要があります。
アプリケーションから暗号化が要求されなかった場合、Microsoft SQL Server JDBC Driver は、SQL Server に対して SSL 暗号化のサポートを強制しません。SQL Server インスタンスが SSL 暗号化を強制的に使用するように構成されていない場合、接続は暗号化なしで確立されます。SQL Server インスタンスが SSL 暗号化を強制的に使用するように構成されている場合、ドライバは、使用中の Java 仮想マシン (JVM) が正常に構成されていれば自動的に SSL 暗号化を有効にし、そうでなければ接続を終了してエラーを生成します。
メモ : |
---|
SQL Server で SSL を構成する方法の詳細については、SQL Server オンライン ブックの「SQL Server への接続の暗号化」を参照してください。 |
Microsoft SQL Server JDBC Driver Version 1.2 以降には、アプリケーションで SSL 暗号化を使用できるようにするために、encrypt、trustServerCertificate、trustStore、trustStorePassword、hostNameInCertificate の各接続プロパティが導入されています。詳細については、「接続プロパティの設定」を参照してください。
次の表は、考えられる SSL 接続のシナリオで Microsoft SQL Server JDBC Driver の該当バージョンがどのように動作するのかをまとめたものです。各シナリオでは、それぞれ異なる組み合わせで SSL 接続プロパティが使用されています。表の値の意味を以下に示します。
blank:"接続文字列にプロパティが存在しない"
value:"接続文字列にプロパティが存在し、その値が有効である"
any:"接続文字列にプロパティが存在するかどうか、その値が有効かどうかは関係ない"
メモ : |
---|
SQL Server ユーザー認証の場合も Windows 統合認証の場合も動作は同じです。 |
encrypt | trustServerCertificate | hostNameInCertificate | trustStore | trustStorePassword | 動作 |
---|---|---|---|---|---|
false または空白 |
任意 |
任意 |
任意 |
任意 |
Microsoft SQL Server JDBC Driver は、SQL Server に対して SSL 暗号化のサポートを強制しません。サーバーに自己署名入りの証明書がある場合は、SSL 証明書の交換が開始されます。SSL 証明書の検証は行われず、(ログイン パケット内の) 資格情報のみが暗号化されます。 サーバーがクライアントに SSL 暗号化のサポートを要求している場合は、SSL 証明書の交換が開始されます。SSL 証明書の検証は行われませんが、通信全体が暗号化されます。 |
true |
true |
任意 |
任意 |
任意 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。trustServerCertificate プロパティが "true" に設定されている場合は SSL 証明書の検証が行われないことに注意してください。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
空白 |
空白 |
空白 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、接続 URL に指定されている serverName プロパティを使用してサーバーの SSL 証明書を検証し、信頼マネージャ ファクトリの検索ルールに従って、使用する証明書ストアを決定します。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
値 |
空白 |
空白 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、hostNameInCertificate プロパティに指定されている値を使用して、SSL 証明書のサブジェクトの値を検証します。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
空白 |
値 |
値 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、trustStore プロパティの値を使用して証明書の trustStore ファイルを検索し、trustStorePassword プロパティの値を使用して trustStore ファイルの整合性をチェックします。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
空白 |
空白 |
値 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、trustStorePassword プロパティの値を使用して、既定の trustStore ファイルの整合性をチェックします。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
空白 |
値 |
空白 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、trustStore プロパティの値を使用して、trustStore ファイルの場所を調べます。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
値 |
空白 |
値 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、trustStorePassword プロパティの値を使用して、既定の trustStore ファイルの整合性をチェックします。また、hostNameInCertificate プロパティの値を使用して、SSL 証明書を検証します。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
値 |
値 |
空白 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、trustStore プロパティの値を使用して、trustStore ファイルの場所を調べます。また、hostNameInCertificate プロパティの値を使用して、SSL 証明書を検証します。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
true |
false または空白 |
値 |
値 |
値 |
Microsoft SQL Server JDBC Driver は、SQL Server で SSL 暗号化を使用するように要求します。 サーバーがクライアントに SSL 暗号化のサポートを要求しているか、サーバーが暗号化をサポートしている場合は、SSL 証明書の交換が開始されます。 ドライバは、trustStore プロパティの値を使用して証明書の trustStore ファイルを検索し、trustStorePassword プロパティの値を使用して trustStore ファイルの整合性をチェックします。また、hostNameInCertificate プロパティの値を使用して、SSL 証明書を検証します。 サーバーが暗号化をサポートするように構成されていない場合は、エラーが発生して接続が終了します。 |
encrypt プロパティが true に設定されている場合、Microsoft SQL Server JDBC Driver は、JVM の既定の JSSE セキュリティ プロバイダを使用して、SQL Server と SSL 暗号化をネゴシエートします。既定のセキュリティ プロバイダでは、SSL 暗号化の正常なネゴシエートに必要なすべての機能がサポートされているとは限りません。たとえば、既定のセキュリティ プロバイダでは、SQL Server の SSL 証明書で使用されている RSA 公開キーのサイズがサポートされていない場合があります。この場合、既定のセキュリティ プロバイダでエラーが発生し、その結果 JDBC ドライバが接続を終了する可能性があります。この問題を解決するには、次のいずれかを実行します。
サイズの小さい RSA 公開キーを持つサーバー証明書を使用して、SQL Server を構成します。
<java-home>/lib/security/java.security セキュリティ プロパティ ファイルで、別の JSSE セキュリティ プロバイダを使用するように JVM を構成します。
別の JVM を使用します。
サーバーの SSL 証明書の検証
サーバーは、SSL ハンドシェイクの際にクライアントに公開キー証明書を送信します。そのサーバー証明書が、クライアントが信頼している証明機関によって発行されているかどうかを、JDBC ドライバまたはクライアントが検証する必要があります。ドライバは、サーバー証明書で次の条件が満たされている状態を必要とします。
信頼されている証明機関から発行されている。
サーバー認証用に発行されている。
有効期限が切れていない。
証明書の subject プロパティの共通名 (CN) が、接続文字列または hostNameInCertificate プロパティ (指定されている場合) に指定されているサーバー名で始まっている。サーバー名が IP アドレスの場合、ドライバは、CN 値がその IP アドレスで始まっているかどうかを検証します。