AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

接続での TLS/SSL の有効化

このガイドでは、JDK の基礎となる TLS/SSL サポートを使用して、TLS/SSL セキュリティプロトコルでMongoDBインスタンスに接続する方法を学習できます。TLS/SSL を使用するように接続を構成するには、 ConnectionString または MongoClientSettings のいずれかで TLS/SSL 設定を有効にします。

注意

TLS/SSL のデバッグ

TLS/SSL 接続の設定に問題が発生した場合は、-Djavax.net.debug=all システムプロパティを使用してさらにログステートメントを表示できます。詳細については、 TLS/SSL 接続をデバッグするためのOracleガイドを参照してください。

MongoDB インスタンスへの接続に TLS/SSL を有効にするには、接続文字列のパラメーターを使用する方法と、MongoClientSettings.Builder クラスのメソッドを使用する方法の 2 通りがあります。

注意

接続文字列の mongodb+srv プレフィックスで示される DNS シードリスト プロトコルを使用して接続する場合、ドライバーは TLS/SSL を有効にします。これを無効にするには、接続文字列または MongoClientSettings インスタンスで tls または ssl パラメーターの値を false に設定します。

DNS シードリストを使用する場合の接続動作の詳細については、サーバー マニュアルの「 SRV 接続形式」セクションを参照してください。

ConnectionString を使用した接続で TLS/SSL を有効にするには、接続文字列パラメータtls trueに渡される接続文字列で の値を割り当てます。MongoClients.create()

MongoClient mongoClient = MongoClients.create("mongodb+srv://<db_username>:<db_password>@<cluster-url>?tls=true");

次の表では、接続文字列に含めてドライバーの TSL 動作を変更できるパラメーターについて説明しています。

オプション名
タイプ
説明

ssl

ブール値

MongoDBインスタンスとのすべての通信が必要であることを指定します

TLS/SSL を使用するtls オプションによって置き換えられます。

デフォルト:false

tls

ブール値

MongoDBインスタンスとのすべての通信が必要であることを指定します

TLS を使用するssl オプションを置き換えます。

デフォルト:false

tlsInsecure

ブール値

ドライバーが TLS の無効なホスト名を許可する必要があることを指定します

最大数。 tlsAllowInvalidHostnames をtrue に設定するのと同じ効果があります。 TLS セキュリティ制約を他の方法で構成するには、カスタム SSLContext を使用します。

デフォルト:false

tlsAllowInvalidHostnames

ブール値

無効なホスト名を許可する必要があることを指定します

TLS 接続の証明書を使用します。sslInvalidHostNameAllowed をスーパー優先します。

デフォルト:false

クラスを使用して MongoClientの TLS/SSL 接続オプションを構成するには、MongoClientSettings.Builder applyToSslSettings() メソッドをチェーンします。enabled trueSslSettings.BuilderTLS/SSL を有効にするには、次のように ブロックで プロパティを に設定します。

MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder().applyConnectionString(new ConnectionString("<your connection string>"))
.applyToSslSettings(builder ->
builder.enabled(true))
.build());

次の表では、 設定に連鎖させてドライバーの TSL 動作を変更できる方法について説明します。

方式
説明

applyConnectionString()

ConnectionStringオブジェクトの設定を使用します。

applySettings()

SslSettingsオブジェクトで指定された TLS/SSL 設定を使用します。

context()

TLS/SSL を有効にする場合に使用するSSLContextを設定します。

enabled()

TLS/SSL を有効にするかどうか。 (Atlas クラスターではこれを有効にする必要があります)。

invalidHostNameAllowed()

サーバーのホスト名と TLS 証明書で指定されたホスト名との間で、不一致を許可するかどうか。

TLS/SSL 要求を開始する Java アプリケーションは、アプリケーション自体と、アプリケーションが対話する他のアプリケーションの ID を証明する暗号化証明書にアクセスする必要があります。次のメカニズムを使用して、アプリケーションでこれらの証明書へのアクセスを構成できます。

  • JVM トラスト ストアと JVM キー ストア

  • クライアント固有のトラスト ストアとキー ストア

注意

以下のセクションは Oracle JDK のドキュメントに基づいているため、一部は JDK またはカスタム TLS/SSL 実装には適用されない可能性があります。

注意

デフォルトでは 、JRE には、 let の暗号化 などの署名機関からの一般的に使用される多くの公開証明書が含まれています。その結果、信頼ストアを構成せずに、TLS/SSL を使用してMongoDB Atlasのインスタンス(または JRE のデフォルトの証明書ストア内の認証局によって証明書が署名されている他のサーバー)に接続できます。

JVM 信頼ストアには、Java アプリケーションが対話する他のアプリケーションを安全に識別する証明書が保存されます。これらの証明書を使用すると、アプリケーションは別のアプリケーションへの接続が本物であり、第三者による改ざんから安全であることを証明できます。

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>

注意

デフォルトでは、MongoDB インスタンスはクライアント証明書の検証を実行しません。MongoDB インスタンスをクライアント証明書を検証するように構成した場合は、キー ストアを構成する必要があります。

JVM キー ストアには、Java アプリケーションを他のアプリケーションに対して安全に識別する証明書が保存されます。これらの証明書を使用すると、他のアプリケーションは、アプリケーションへの接続が本物であり、第三者による改ざんから安全であることを証明できます。

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 を使用して Java アプリケーションを構成する方法の詳細については、JSSE リファレンス ガイドを参照してください。

SSLContext クラスの init() メソッドを使用して、クライアント固有のトラスト ストアとキー ストアを構成できます。

SSLContextインスタンスを使用してクライアントを構成する方法の例については、このガイドの「 SSLContext を使用して TLS/SSL 構成をカスタマイズする 」セクションを参照してください。

SSLContext クラスの詳細については、SSL コンテキストの API ドキュメントを参照してください。

デフォルトでは、ドライバーはサーバーの TLS/SSL 証明書に含まれるホスト名が MongoClient の構築時に指定されたホスト名と一致することを確認します。アプリケーションのホスト名検証を無効にするには、applytoSslSettings() ビルダー ラムダでビルダーの invalidHostNameAllowed プロパティを true に設定して明示的に無効にします。

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.invalidHostNameAllowed(true);
})
.build();

警告

ホスト名検証を無効にすると、構成が安全でなくなります。テスト目的で、または他に代替策がない場合にのみホスト名検証を無効にします。

アプリケーションが TLS 1.2 プロトコルのみを使用するように制限するには、jdk.tls.client.protocols システム プロパティを「TLSv1.2」に設定します。

注意

Java 8 以前の Java ランタイム環境(JRE)では、アップデート リリースでのみ TLS 1.2 プロトコルが有効になっていました。JRE で TLS 1.2 プロトコルが有効になっていない場合は、TLS 1.2 を使用して接続できるように、新しいリリースにアップグレードしてください。

TLS/SSL 構成をカスタマイズする必要がある場合は、sslContext ラムダのビルダにMongoClient SSLContextオブジェクトを渡すことで、 の プロパティを設定できます。applyToSslSettings()

SSLContext sslContext = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.context(sslContext);
})
.build();
MongoClient client = MongoClients.create(settings);

ネットワーク IO 用に Netty とともにドライバーを使用する場合は、Netty によって提供される代替の TLS/SSL プロトコル実装をプラグインするオプションがあります。

import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.SslProvider;

注意

ドライバーは Netty バージョンでテストします io.netty:netty-all:4.2.9.Final

ドライバーに io.netty.handler.ssl.SslContext を使用するように指示するには、MongoClientSettings を定義する場合、NettyTransportSettings を構成します。 MongoClientSettings.Builder.transportSettings と NettyTransportSettings.Builder.sslContext を使用して、設定をビルドします。

SslContext sslContext = SslContextBuilder.forClient()
.sslProvider(SslProvider.OPENSSL)
.build();
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true))
.transportSettings(TransportSettings.nettyBuilder()
.sslContext(sslContext)
.build())
.build();
MongoClient client = MongoClients.create(settings);

io.netty.handler.ssl.SslProvider の詳細については、Netty のドキュメントを参照してください。

OCSP は、X.509 証明書が失効しているかどうかを確認するために使用される標準です。証明機関は、有効期限が切れる前に X.509 証明書を証明書失効リスト(CRL)に追加して、証明書を無効にすることができます。クライアントが TLS ハンドシェイク中に X.509 証明書を送信すると、CA の失効サーバーは CRL をチェックし、「良好」、「失効」、または「不明」のステータスを返します。

ドライバーは、OCSP の次のバリエーションをサポートします。

  • クライアント駆動型 OCSP

  • OCSP ステープル

次のセクションでは、それらの違いと、アプリケーションでそれらを有効にする方法について説明します。

注意

Java ドライバーは、アプリケーション用に構成された JVM 引数を使用するため、特定の MongoClient インスタンスに対してオーバーライドすることはできません。

注意

Let's Encrypt OCSP の廃止

let s Encrypt は、新しい証明書の OCSP サポートを終了しました。 let s Encrypt によって発行された新しい証明書には、OCSP レスポンダーURL が含まれない場合があります。 OCSP 失効チェックは、証明書に OCSP URI が含まれている場合にのみ実行されるため、OCSP URLが欠落していることは予想されており、必ずしもMongoDBデプロイの問題を示すものではありません。

クライアント駆動型 OCSP では、クライアントはサーバーから証明書を受信した後、OCSP 要求で証明書を OCSP レスポンダーに送信します。OCSP レスポンダは、証明機関(CA)を使用して証明書のステータスを確認し、クライアントに送信された応答で証明書が有効かどうかを報告します。

アプリケーションでクライアント駆動型 OCSP を有効にするには、次の JVM システム プロパティを設定します。

プロパティ
値

com.sun.net.ssl.checkRevocation

失効チェックを有効にするには、このプロパティを true に設定します。

ocsp.enable

クライアント駆動型 OCSP を有効にするには、このプロパティを true に設定します。

警告

OCSP レスポンダーが利用できない場合、JDK によって提供される TLS サポートは「ハード フェイル」を報告します。これは、MongoDB Shell や他のドライバーの「ソフト フェイル」動作とは異なります。

OCSP ステープリングは、サーバーが証明機関(CA)から署名された証明書を取得し、それをクライアントへのタイムスタンプ付きの OCSP 応答に含める必要があるメカニズムです。

アプリケーションで OCSP ステープルを有効にするには、次の JVM システム プロパティを設定します。

プロパティ
説明

com.sun.net.ssl.checkRevocation

失効チェックを有効にするには、このプロパティを true に設定します。

jdk.tls.client.enableStatusRequestExtension

OCSP ステープリングを有効にするには、このプロパティを true に設定します。

設定されていない場合、または false に設定されている場合は、証明書失効応答の有無や状態に関係なく接続を続行できます。

OCSP の詳細については、次のリソースを参照してください。