接続での TLS/SSL の有効化
項目一覧
Overview
このガイドでは、 TLS/SSL を使用して MongoDB インスタンスに接続する方法を学びます。 JDK で基礎となる TLS/SSL サポートを使用するセキュリティ プロトコル。TLS/SSL を使用するように 接続 を構成するには、ConnectorString で TLS/SSL 設定を有効にします。 または MongoClientSettings。
注意
TLS/SSL のデバッグ
TLS/SSL 接続の設定に問題が発生した場合は、 -Djavax.net.debug=all
システム プロパティを使用してさらにログ ステートメントを表示できます。 TLS/SSL 接続のデバッグに関する Oracle ガイドを参照して ください 詳しくは、 を参照してください。
TLS/SSL を有効にする
MongoDB インスタンスへの接続に TLS/SSL を有効にするには、接続文字列のパラメーターを使用する方法と、MongoClientSettings.Builder
クラスのメソッドを使用する方法の 2 通りがあります。
注意
接続文字列の mongodb+srv
プレフィックスで示される DNS シードリスト プロトコルを使用して接続する場合、ドライバーは TLS/SSL を有効にします。これを無効にするには、接続文字列または MongoClientSettings
インスタンスで tls
または ssl
パラメーターの値を false
に設定します。
DNS シードリストを使用する場合の接続動作の詳細については、サーバー マニュアルの「 SRV 接続形式」セクションを参照してください。
ConnectionString を使用した接続で TLS/SSL を有効にするにはstring tls
true
に渡される接続 で、接続 パラメータ に の値を割り当てます。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 実装には適用されない可能性があります。
JVM トラスト ストアを構成する
注意
デフォルトでは、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>
JVM キー ストアを構成する
注意
デフォルトでは、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 への接続のみを制限する
アプリケーションが TLS 1.2 プロトコルのみを使用するように制限するには、jdk.tls.client.protocols
システム プロパティを「TLSv1.2」に設定します。
注意
Java 8 以前の Java ランタイム環境(JRE)では、アップデート リリースでのみ TLS 1.2 プロトコルが有効になっていました。JRE で TLS 1.2 プロトコルが有効になっていない場合は、TLS 1.2 を使用して接続できるように、新しいリリースにアップグレードしてください。
Java SE SSLContext を介して TLS/SSL 構成をカスタマイズする
TLS/SSL 構成をカスタマイズする必要がある場合は、applyToSslSettings()
ラムダのビルダに SSLContext オブジェクトを渡すことで、MongoClient
の sslContext
プロパティを設定できます。
SSLContext sslContext = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> { builder.enabled(true); builder.context(sslContext); }) .build(); MongoClient client = MongoClients.create(settings);
Netty SslContext を通じて TLS/SSL 構成をカスタマイズする
ネットワーク 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.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)
OCSP は、X.509 証明書が失効しているかどうかを確認するために使用される標準です。証明機関は、有効期限が切れる前に X.509 証明書を証明書失効リスト(CRL)に追加して、証明書を無効にすることができます。クライアントが TLS ハンドシェイク中に X.509 証明書を送信すると、CA の失効サーバーは CRL をチェックし、「良好」、「失効」、または「不明」のステータスを返します。
ドライバーは、OCSP の次のバリエーションをサポートします。
クライアント駆動型 OCSP
OCSP ステープル
次のセクションでは、それらの違いと、アプリケーションでそれらを有効にする方法について説明します。
注意
Java ドライバーは、アプリケーション用に構成された JVM 引数を使用するため、特定の MongoClient
インスタンスに対してオーバーライドすることはできません。
クライアント駆動型 OCSP
クライアント駆動型 OCSP では、クライアントはサーバーから証明書を受信した後、OCSP 要求で証明書を OCSP レスポンダーに送信します。OCSP レスポンダは、証明機関(CA)を使用して証明書のステータスを確認し、クライアントに送信された応答で証明書が有効かどうかを報告します。
アプリケーションでクライアント駆動型 OCSP を有効にするには、次の JVM システム プロパティを設定します。
プロパティ | 値 |
---|---|
com.sun.net.ssl.checkRevocation | 失効チェックを有効にするには、このプロパティを true に設定します。 |
ocsp.enable | クライアント駆動型 OCSP を有効にするには、このプロパティを true に設定します。 |
警告
OCSP レスポンダーが利用できない場合、JDK によって提供される TLS サポートは「ハード フェイル」を報告します。これは、MongoDB Shell や他のドライバーの「ソフト フェイル」動作とは異なります。
OCSP ステープル
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 の詳細については、次のリソースを参照してください。
Oracle JDK 8 のドキュメント: アプリケーションで OCSP を有効にする方法