Overview
このガイドでは、JDK の基礎となる TLS/SSL サポートを使用して、TLS/SSL セキュリティプロトコルでMongoDBインスタンスに接続する方法を説明します。TLS/SSL を使用するように接続を構成するには、 ConnectionString または MongoClientSettings のいずれかで TLS/SSL 設定を有効にします。
注意
TLS/SSL のデバッグ
TLS/SSL 接続の設定に問題が発生した場合は、-Djavax.net.debug=all システムプロパティを使用してさらにログステートメントを表示できます。詳細については、 TLS/SSL 接続をデバッグするためのOracleガイドを参照してください。
TLS/SSL を有効にする
MongoDB インスタンスへの接続に TLS/SSL を有効にするには、接続文字列のパラメーターを使用する方法と、MongoClientSettings.Builder クラスのメソッドを使用する方法の 2 通りがあります。
注意
DNS シードリスト プロトコルが TLS を有効にする
接続stringの mongodb+srv プレフィックスで示される DNS シードリスト プロトコルを使用して接続する場合、ドライバーは TLS/SSL を自動的に有効にします。 これを無効にするには、接続stringで tls パラメータの値を false に設定するか、MongoClientSettings インスタンスを作成するときに SslSettings.Builder ブロックで enabled プロパティを false に設定します。
DNS シードリストを使用する場合の接続動作の詳細については、サーバー マニュアルの「 SRV 接続形式」セクションを参照してください。
ConnectionString を使用した接続で TLS/SSL を有効にするには、 に渡される接続文字列で接続文字列パラメータtls に の値を割り当てます。trueMongoClient.create()
val mongoClient = MongoClient.create("mongodb+srv://<db_username>:<db_password>@<cluster-url>?tls=true")
MongoClientSettings.Builder クラスを使用して MongoClient の TLS/SSL 接続オプションを構成するには、applyToSslSettings() メソッドを呼び出します。TLS/SSL を有効にするには、SslSettings.Builderブロックで enabled プロパティを true に設定します。
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string>")) .applyToSslSettings { builder -> builder.enabled(true) } .build() val mongoClient = MongoClient.create(settings)
証明書の構成
TLS/SSL 要求を開始する Kotlin アプリケーションは、アプリケーション自体と、アプリケーションが対話する他のアプリケーションの ID を証明する暗号化証明書にアクセスする必要があります。 次のメカニズムを使用して、アプリケーションでこれらの証明書へのアクセスを構成できます。
JVM トラスト ストアと JVM キー ストア
クライアント固有のトラスト ストアとキー ストア
注意
以下のセクションは Oracle JDK のドキュメントに基づいているため、一部は JDK または使用するカスタム TLS/SSL 実装には適用されない可能性があります。
JVM トラスト ストアを構成する
注意
デフォルトでは 、JRE には、 let の暗号化 などの署名機関からの一般的に使用される多くの公開証明書が含まれています。その結果、信頼ストアを構成せずに、TLS/SSL を使用してMongoDB Atlasのインスタンス(または JRE のデフォルトの証明書ストア内の認証局によって証明書が署名されている他のサーバー)に接続できます。
JVM 信頼ストアには、 Kotlin アプリケーションが対話する他のアプリケーションを安全に識別する証明書が保存されます。 これらの証明書を使用すると、アプリケーションは別のアプリケーションへの接続が本物であり、第三者による改ざんから安全であることを証明できます。
MongoDB インスタンスが、JRE のデフォルトの証明書ストアに存在しない認証局によって署名された証明書を使用する場合、アプリケーションは SSL/TLS 要求を開始するために 2 つのシステム プロパティを構成する必要があります。これらのプロパティにより、アプリケーションは接続された MongoDB インスタンスによって提示される TLS/SSL 証明書を検証できるようになります。
javax.net.ssl.trustStore: 署名機関の証明書を含むトラスト ストアへのパスjavax.net.ssl.trustStorePassword: 次の場所で定義されたトラスト ストアにアクセスするためのパスワード:javax.net.ssl.trustStore
JDK の一部として提供される keytool コマンドラインツールを使用してトラスト ストアを作成できます。
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <password>
JVM キー ストアを構成する
注意
デフォルトでは、MongoDB インスタンスはクライアント証明書の検証を実行しません。MongoDB インスタンスをクライアント証明書を検証するように構成した場合は、キー ストアを構成する必要があります。
JVM キー ストアには、 Kotlin アプリケーションを他のアプリケーションに対して安全に識別する証明書が保存されます。 これらの証明書を使用すると、他のアプリケーションは、アプリケーションへの接続が本物であり、第三者による改ざんから安全であることを証明できます。
TLS/SSL 要求を開始するアプリケーションでは、クライアントが MongoDB サーバーに TLS/SSL 証明書を提示するように、2 つの JVM システム プロパティを設定する必要があります。
javax.net.ssl.keyStore: クライアントの TLS/SSL 証明書を含むキーストアへのパスjavax.net.ssl.keyStorePassword: 次の場所で定義されたキー ストアにアクセスするためのパスワード:javax.net.ssl.keyStore
keytool または Openssl コマンドラインツールを使用してキー ストアを作成できます。
TLS/SSL を使用してKotlinアプリケーションを構成する方法の詳細については、 JSSE リファレンス ガイド を参照してください。
クライアント固有の信頼ストアとキー ストアを構成する
SSLContext クラスの init() メソッドを使用して、クライアント固有のトラスト ストアとキー ストアを構成できます。
SSLContextインスタンスを使用してクライアントを構成する方法の例については、このガイドの「 SSLContext を使用して TLS/SSL 構成をカスタマイズする 」セクションを参照してください。
SSLContextクラスの詳細については、SSL コンテキストのAPIドキュメントを参照してください。
ホスト名検証を無効化する
デフォルトでは、ドライバーはサーバーの TLS/SSL 証明書に含まれるホスト名が MongoClient の構築時に指定されたホスト名と一致することを確認します。アプリケーションのホスト名検証を無効にするには、applytoSslSettings() ビルダー ラムダでビルダーの invalidHostNameAllowed プロパティを true に設定して明示的に無効にします。
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string>")) .applyToSslSettings { builder -> builder.enabled(true) builder.invalidHostNameAllowed(true) } .build() val mongoClient = MongoClient.create(settings);
警告
ホスト名検証を無効にすると、構成が安全でなくなります。テスト目的で、または他に代替策がない場合にのみホスト名検証を無効にします。
TLS 1.2 への接続のみを制限する
アプリケーションが TLS 1.2 プロトコルのみを使用するように制限するには、jdk.tls.client.protocols システム プロパティを「TLSv1.2」に設定します。
注意
Java 8 以前の Java ランタイム環境(JRE)では、アップデート リリースでのみ TLS 1.2 プロトコルが有効になっていました。JRE で TLS 1.2 プロトコルが有効になっていない場合は、TLS 1.2 を使用して接続できるように、新しいリリースにアップグレードしてください。
Java SE SSLContext を介して TLS/SSL 構成をカスタマイズする
TLS/SSL 構成をカスタマイズする必要がある場合は、applyToSslSettings() ラムダのビルダに SSLContext オブジェクトを渡すことで、MongoClient の sslContext プロパティを設定できます。
// You can customize SSL settings using the SSLContext val sslContext = SSLContext.getDefault() val settings = MongoClientSettings.builder() .applyToSslSettings { builder -> builder.enabled(true) builder.context(sslContext) } .build() val mongoClient = MongoClient.create(settings);
オンライン証明書ステータスプロトコル (OCSP)
OCSP は、X.509 証明書が失効しているかどうかを確認するために使用される標準です。証明機関は、有効期限が切れる前に X.509 証明書を証明書失効リスト(CRL)に追加して、証明書を無効にすることができます。クライアントが TLS ハンドシェイク中に X.509 証明書を送信すると、CA の失効サーバーは CRL をチェックし、「良好」、「失効」、または「不明」のステータスを返します。
ドライバーは、OCSP の次のバリエーションをサポートします。
クライアント駆動型 OCSP
OCSP ステープル
次のセクションでは、それらの違いと、アプリケーションでそれらを有効にする方法について説明します。
注意
Kotlin ドライバーはアプリケーション用に構成された JVM 引数を使用するため、特定のMongoClientインスタンスに対してオーバーライドすることはできません。
クライアント駆動型 OCSP
クライアント駆動型 OCSP では、クライアントはサーバーから証明書を受信した後、OCSP 要求で証明書を OCSP レスポンダーに送信します。OCSP レスポンダは、証明機関(CA)を使用して証明書のステータスを確認し、クライアントに送信された応答で証明書が有効かどうかを報告します。
アプリケーションでクライアント駆動型 OCSP を有効にするには、次の JVM システム プロパティを設定します。
プロパティ | 値 |
|---|---|
| 失効チェックを有効にするには、このプロパティを |
| クライアント駆動型 OCSP を有効にするには、このプロパティを |
警告
OCSP レスポンダーが利用できない場合、JDK によって提供される TLS サポートは「ハード フェイル」を報告します。これは、MongoDB Shell や他のドライバーの「ソフト フェイル」動作とは異なります。
OCSP ステープル
OCSP ステープリングは、サーバーが証明機関(CA)から署名された証明書を取得し、それをクライアントへのタイムスタンプ付きの OCSP 応答に含める必要があるメカニズムです。
アプリケーションで OCSP ステープルを有効にするには、次の JVM システム プロパティを設定します。
プロパティ | 説明 |
|---|---|
| 失効チェックを有効にするには、このプロパティを |
| Set this property to true to enable OCSP stapling.If unset or set to false, the connection can proceed regardless of the presence or status of the certificate revocation response. |
OCSP の詳細については、次のリソースを参照してください。
Oracle JDK 8 のドキュメント: アプリケーションで OCSP を有効にする方法