Docs Menu
Docs Home
/ / /
Java Sync Driver
/ /

接続での TLS/SSL の有効化

項目一覧

  • Overview
  • TLS/SSL を有効にする
  • 証明書の構成
  • JVM トラスト ストアを構成する
  • JVM キー ストアを構成する
  • クライアント固有の信頼ストアとキー ストアを構成する
  • ホスト名検証を無効化する
  • TLS 1.2 への接続のみを制限する
  • Java SE SSLContext を介して TLS/SSL 構成をカスタマイズする
  • Netty SslContext を通じて TLS/SSL 構成をカスタマイズする
  • オンライン証明書ステータスプロトコル (OCSP)
  • クライアント駆動型 OCSP
  • OCSP ステープル

このガイドでは、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 を有効にするにはstring tlstrueに渡される接続 で、接続 パラメータ に の値を割り当てます。stringMongoClients.create()

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

MongoClientSettings.Builder クラスを使用して MongoClient の TLS/SSL 接続オプションを構成するには、applyToSslSettings() メソッドを呼び出します。TLS/SSL を有効にするには、SslSettings.Builderブロックで enabled プロパティを true に設定します。

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

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 -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

キー ツール を使用してキー ストアを作成できます または Opensl コマンドライン ツール。

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

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

ドライバーに io.netty.handler.ssl.SslContext を使用するように指示するには、MongoClientSettings を定義する場合、NettyTransportSettings を構成します。 MongoClientSettings.Builder.transportSettingsNettyTransportSettings.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 インスタンスに対してオーバーライドすることはできません。

クライアント駆動型 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
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 の詳細については、次のリソースを参照してください。

戻る

ネットワーク圧縮