Docs Menu
Docs Home
/ / /
Java Reactive Streams ドライバー
/ /

TLS/SSL

項目一覧

  • MongoClient API
  • ConnectionString での TLS/SSL の指定
  • MongoClientSettings で TLS/SSL を指定する
  • MongoClientSettings で Java SE SSLContext を指定する
  • Netty SslContext を通じて TLS/SSL 構成をカスタマイズする
  • ホスト名検証を無効化する
  • 一般的な TLS/SSL 構成タスク
  • トラスト ストアとキー ストアの構成
  • TLS v 1.2の強制
  • OCSP

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

TLS/SSL を使用するようにドライバーを構成するには、 ConnectionStringまたはMongoClientSettingsインスタンスでオプションを指定します。

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

import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoClient;

ConnectionString で TLS/SSL を指定するには、 接続stringの一部として ssl=true を指定します。

MongoClient mongoClient = MongoClients.create("mongodb://localhost/?ssl=true");

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

import com.mongodb.MongoClientSettings;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoClient;

MongoClientSettingsインスタンスで TLS/SSL を指定するには、 enabledプロパティをtrueに設定します。

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true))
.build();
MongoClient client = MongoClients.create(settings);

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

import javax.net.ssl.SSLContext;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoClient;

MongoClientSettingsjavax.net.ssl.SSLContextを指定するには、 sslContextプロパティを設定します。

SSLContext sslContext = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true).context(sslContext))
.build();
MongoClient client = new MongoClient(settings);

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

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.1.87.Final

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

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 のドキュメントを参照してください。

デフォルトでは、ドライバーはサーバーの SSL 証明書に含まれるホスト名がMongoClientの構築時に指定されたホスト名と一致することを確認します。

アプリケーションでホスト名検証を無効にする必要がある場合は、 MongoClientSettingsでこれを明示的に指定する必要があります。

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

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

javax.net.ssl.SSLContext.init(KeyManager[] km, TrustManager[] tm, SecureRandom random)を使用してクライアントに固有のトラスト ストアとキー ストアを構成することも、JVM のデフォルトのものを設定することもできます。

一般的なアプリケーションでは、サーバーによって提示された TLS/SSL 証明書をクライアントが検証できるようにするために、いくつかの JVM システム プロパティを設定する必要があります。

  • javax.net.ssl.trustStore: 署名機関の証明書を含むトラスト ストアへのパス

  • javax.net.ssl.trustStorePassword: このトラスト ストアにアクセスするためのパスワード

信頼ストアは通常、JDK の一部として提供されるkeytoolコマンドライン プログラムを使用して作成されます。

keytool -importcert -trustcacerts -file <path to certificate authority file>
-keystore <path to trust store> -storepass <trust store password>

一般的なアプリケーションでは、クライアントが MongoDB サーバーに TLS/SSL クライアント証明書を提示するようにするために、いくつかの JVM システム プロパティも設定する必要があります。

  • javax.net.ssl.keyStore: クライアントの TLS/SSL 証明書を含むキーストアへのパス

  • javax.net.ssl.keyStorePassword: このキー ストアにアクセスするためのパスワード

キー ストアは通常、 keytoolまたはopensslコマンドライン プログラムを使用して作成されます。 たとえば、クライアント証明書とその秘密キーを含むファイルがあり、 PKCS12 にキー ストアを作成したいとします 形式の場合は、次のコマンドを実行できます。

openssl pkcs12 -export -in <path to client certificate & private key file>
-out <path to key store> -passout pass:<trust store password>

TLS/SSL 用の Java アプリケーション構成の詳細については、 JSSE リファレンス ガイド を参照してください。

アプリケーションによっては、TLS 1.2プロトコルのみを強制したい場合があります。 これを行うには、 jdk.tls.client.protocolsシステム プロパティをTLSv1.2に設定します。

Java 8が開始する前の Java ランタイム環境では、前のセクションに示されているように、後の更新でのみ TLS 1.2プロトコルが有効になっていました。 Java 8より前の Java ランタイム環境で TLS 1.2プロトコルの使用を強制するようにするには、アップデートで TLS 1.2が有効になっていることを確認します。

注意

ドライバーは、個別のMongoClient単位でデフォルトで OCSP を有効にすることはできません。

クライアント駆動型 OCSP を有効にするには、アプリケーションで次の JVM システムとセキュリティ プロパティを設定する必要があります。

  • com.sun.net.ssl.checkRevocation: trueに設定すると、このシステム プロパティは失効チェックを有効にします。

  • ocsp.enable: trueに設定すると、このセキュリティ プロパティはクライアント駆動型 OCSP を有効にします

クライアント駆動型 OCSP を使用するようにアプリケーションを構成するには、TLS を使用してサーバーに接続するようにアプリケーションがすでに設定されている必要があります。 クライアント駆動型 OCSP を有効にするには、これらのシステム プロパティを設定する必要があります。

注意

JDK によって提供される TLS のサポートでは、 mongoshや「ソフト フェイル」動作を使用するドライバーとは対照的に、OCSP レスポンダーが使用できない場合に「ハード フェイル」動作が利用されます。

重要

TLS 1.3プロトコルを使用する Java ランタイム環境で OCSP ステープリングを使用している場合、次の例外が発生する可能性があります(Java 11以降では、デフォルトで TLS 1.3が使用されます)。

javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request

この例外は、Java 11以上の TLS 1.3の既知の問題によるものです。 TLS 1.3プロトコルで動作する Java ランタイム環境を使用する場合にこの例外を回避するには、アプリケーションに TLS 1.2プロトコルを使用するように強制します。 これを行うには、 jdk.tls.client.protocolsシステム プロパティをTLSv1.2に設定します。

OCSP ステープリングを設定するには、アプリケーションでいくつかの JVM システム プロパティを設定する必要があります。

  • jdk.tls.client.enableStatusRequestExtension: true (デフォルト値)に設定すると、OCSP ステープルが有効になります。

  • com.sun.net.ssl.checkRevocation: trueに設定すると、失効チェックが有効になります。 このプロパティがtrueに設定されていない場合は、失効情報の有無や状態に関係なく、接続の続行が許可されます。

OCSP ステープリングを使用するようにアプリケーションを構成するには、アプリケーションが TLS を使用してサーバーに接続するようにすでに設定されている必要があり、サーバーは TLS ハンドシェイクの一部として返される証明書への OCSP 応答をステープリングするように設定されている必要があります。

OCSP を使用して Java アプリケーションを構成する方法の詳細については、「 クライアント駆動型 OCSP と OCSP ステープリング 」を参照してください。 Java のドキュメントを参照してください。

戻る

MongoDB に接続する