TLS/SSL
項目一覧
デフォルトでは、ドライバーは JDK によって提供される TLS/SSL の基礎のサポートを使用して、MongoDB サーバーへの TLS/SSL 接続をサポートします。 これは、 Java SE API の拡張性を利用して変更できます 、または Netty API を使用して。
MongoClient API
TLS/SSL を使用するようにドライバーを構成するには、 ConnectionString
またはMongoClientSettings
インスタンスでオプションを指定します。
ConnectionString での TLS/SSL の指定
次のインポート ステートメントを含めます。
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");
MongoClientSettings で TLS/SSL を指定する
次のインポート ステートメントを含めます。
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);
MongoClientSettings で Java SE SSLContext を指定する
次のインポート ステートメントを含めます。
import javax.net.ssl.SSLContext; import com.mongodb.MongoClientSettings; import com.mongodb.MongoClient;
MongoClientSettings
でjavax.net.ssl.SSLContext
を指定するには、 sslContext
プロパティを設定します。
SSLContext sslContext = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true).context(sslContext)) .build(); MongoClient client = new MongoClient(settings);
Netty SslContext を通じて 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.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();
一般的な TLS/SSL 構成タスク
このセクションは、 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 v 1.2の強制
アプリケーションによっては、TLS 1.2プロトコルのみを強制したい場合があります。 これを行うには、 jdk.tls.client.protocols
システム プロパティをTLSv1.2
に設定します。
Java 8が開始する前の Java ランタイム環境では、前のセクションに示されているように、後の更新でのみ TLS 1.2プロトコルが有効になっていました。 Java 8より前の Java ランタイム環境で TLS 1.2プロトコルの使用を強制するようにするには、アップデートで TLS 1.2が有効になっていることを確認します。
OCSP
注意
ドライバーは、個別のMongoClient
単位でデフォルトで OCSP を有効にすることはできません。
クライアント駆動型 OCSP
クライアント駆動型 OCSP を有効にするには、アプリケーションで次の JVM システムとセキュリティ プロパティを設定する必要があります。
com.sun.net.ssl.checkRevocation
:true
に設定すると、このシステム プロパティは失効チェックを有効にします。ocsp.enable
:true
に設定すると、このセキュリティ プロパティはクライアント駆動型 OCSP を有効にします
クライアント駆動型 OCSP を使用するようにアプリケーションを構成するには、TLS を使用してサーバーに接続するようにアプリケーションがすでに設定されている必要があります。 クライアント駆動型 OCSP を有効にするには、これらのシステム プロパティを設定する必要があります。
注意
JDK によって提供される TLS のサポートでは、 mongosh
や「ソフト フェイル」動作を使用するドライバーとは対照的に、OCSP レスポンダーが使用できない場合に「ハード フェイル」動作が利用されます。
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 のドキュメントを参照してください。