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

接続での TLS/SSL の有効化

このガイドでは、 TLS プロトコルを使用して MongoDB 配置への接続を保護する方法を学習できます。 TLS は、アプリケーションと MongoDB 間の通信を保護する暗号化プロトコルです。 TLS を使用するように接続を構成するには、 TLS オプションを有効にし、クライアントを作成するときに検証用の証明書を提供します。

デフォルトでは 、ドライバーは JDK によって提供される TLS/SSL の基礎サポートを使用して、 MongoDBサーバーへの TLS/SSL 接続をサポートします。これは、Netty APIを使用するか、Java SE APIの拡張性を使用して変更できます。

Tip

非同期アプリでは Netty を使用する

非同期アプリケーションには Netty を使用することをお勧めします。非同期 I/O をサポートし、多くの接続量を効果的に取り扱うためです。Netty を使用して TLS 設定を構成する方法については、このガイドのNetty SslContext を使用して 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 のデバッグ

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

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

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

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

注意

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

注意

デフォルトでは 、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>

注意

デフォルトでは、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 プロトコルのみを使用するように制限するには、jdk.tls.client.protocols システム プロパティを「TLSv1.2」に設定します。

注意

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

次のインポート ステートメントを含めます。

import com.mongodb.MongoClientSettings
import com.mongodb.connection.SslSettings
import com.mongodb.connection.TransportSettings
import com.mongodb.kotlin.client.coroutine.MongoClient
import io.netty.handler.ssl.SslContextBuilder
import io.netty.handler.ssl.SslProvider

注意

Netty パッケージ バージョン

ドライバーは Nettyパッケージバージョン でテストされています。 io.netty:netty-all:4.1.87.Final

ドライバーに io.netty.handler.ssl.SslContext を使用するように指示するには、 を定義するときに NettyTransportSettings MongoClientSettingsを構成します。

MongoClientSettings.Builder.transportSettings()NettyTransportSettings.Builder.sslContext()を使用して設定をビルドします。

val sslContext = SslContextBuilder.forClient()
.sslProvider(SslProvider.OPENSSL)
.build()
val settings = MongoClientSettings.builder()
.applyToSslSettings { builder: SslSettings.Builder -> builder.enabled(true) }
.transportSettings(
TransportSettings.nettyBuilder()
.sslContext(sslContext)
.build()
)
.build()
val mongoClient = MongoClient.create(settings);

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

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

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

  • クライアント駆動型 OCSP

  • OCSP ステープル

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

注意

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

注意

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 の詳細については、次のリソースを参照してください。