接続での TLS の有効化
項目一覧
Overview
このガイドでは、 Kotlin Syncドライバーを使用してMongoDBに接続するときに TLS セキュリティプロトコルを使用する方法を説明します。
TLS の有効化
MongoDB インスタンスへの接続で TLS を有効にするには、次の方法があります。
接続 での {0 パラメータの設定
tls
stringMongoClientSettings
インスタンスの作成時にSslSettings.Builder
クラスのenabled()
メソッドを使用
注意
DNS シードリスト プロトコルが TLS を有効にする
接続stringの mongodb+srv
プレフィックスで示される DNS シードリスト プロトコルを使用して接続する場合、ドライバーは TLS を自動的に有効にします。
DNS シードリストを使用する場合の接続動作の詳細については、サーバー マニュアルの接続文字列ガイドの「 SRV 接続形式」セクションを参照してください。
接続stringを使用して接続で TLS を有効にするには、次のコードに示すように、オプション パラメータで tls
オプションを true
に設定し、そのstringを MongoClient.create()
に渡します。
val mongoClient = MongoClient.create("mongodb+srv://<db_username>:<db_password>@<cluster_url>/?tls=true")
MongoClientSettings
インスタンス内で TLS を有効にするには、 applyToSslSettings()
ビルダー メソッドを使用します。 次のコードに示すように、 SslSettings.Builder
ブロックでenabled
プロパティをtrue
に設定します。
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string URI>")) .applyToSslSettings { builder -> builder.enabled(true) } .build() val mongoClient = MongoClient.create(settings)
注意
TLS のデバッグ
TLS 接続の設定に問題が発生した場合は、 -Djavax.net.debug=all
システム プロパティを使用して有効なログ ステートメントを表示できます。 「 SSL/TLS 接続のデバッグ 」を参照してください。 詳細については、Java 言語ドキュメントを参照してください。
証明書の構成
TLS 要求を開始する Kotlin アプリケーションは、アプリケーションの ID を証明し、 Kotlin アプリケーションが対話する他のアプリケーションを検証する暗号化証明書にアクセスする必要があります。 アプリケーション内でこれらの証明書へのアクセスを次の方法で構成できます。
JVM 信頼ストアと JVM キー ストアの使用
クライアント固有のトラスト ストアとキー ストアの使用
JVM トラスト ストアを構成する
注意
デフォルトでは、JRE には let の暗号 化などの署名機関からの一般的に使用される多数の公開証明書が含まれています 。その結果、信頼ストアを構成せずに TLS が有効になっているMongoDB Atlasインスタンス、または JRE のデフォルトの証明書ストアで認証局によって証明書が署名されているその他のサーバーに接続するときに TLS を有効にできます。
JVM 信頼ストアには、 Kotlin アプリケーションが対話する他のアプリケーションを安全に識別する証明書が保存されます。 これらの証明書を使用することで、アプリケーションは別のアプリケーションへの接続が本物であり、第三者による改ざんから安全であることを証明できます。
MongoDB インスタンスが、JRE のデフォルトの証明書ストアに存在しない認証局によって署名された証明書を使用する場合、アプリケーションは TLS 要求を開始するために次のシステム プロパティを構成する必要があります。
javax.net.ssl.trustStore
: クライアントの TLS 証明書を含むトラスト ストアへのパスjavax.net.ssl.trustStorePassword
: 次の場所で定義されたトラスト ストアにアクセスするためのパスワード:javax.net.ssl.trustStore
これらのプロパティにより、アプリケーションは接続された MongoDB インスタンスによって提示される TLS 証明書を検証できるようになります。
次の キーツール を使用してトラスト ストアを作成できます: 次のターミナルコマンドに示すように、JDK からの コマンドライン ツールは利用できません。
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <password>
JVM キー ストアを構成する
注意
デフォルトでは、MongoDB インスタンスはクライアント証明書の検証を実行しません。MongoDB インスタンスをクライアント証明書を検証するように構成した場合は、キー ストアを構成する必要があります。
TLS 要求を開始するアプリケーションは、クライアントが MongoDB サーバーに TLS 証明書を提示するように、次の JVM システム プロパティを設定する必要があります。
javax.net.ssl.keyStore
: クライアントの TLS/SSL 証明書を含むキーストアへのパスjavax.net.ssl.keyStorePassword
: で定義されたキー ストアにアクセスするためのパスワードjavax.net.ssl.keyStore
次のキー ツール を使用してキー ストアを作成できます: または Opensl コマンドライン ツール。
TLS を使用して Kotlin アプリケーションを構成する方法の詳細については、 JSSE リファレンス ガイド を参照してください。 (Java 言語ドキュメント)。
クライアント固有の信頼ストアとキー ストアを構成する
クライアント固有のトラスト ストアとキー ストアを構成するには、 SSLContext
クラスのinit()
メソッドを使用します。
このガイドの「Java SE SSLContext を介して TLS 構成をカスタマイズする 」セクションで、 SSLContext
インスタンスを使用するようにクライアントを構成する方法の例を確認します。
ホスト名検証を無効化する
デフォルトでは、ドライバーはサーバーの TLS 証明書に含まれるホスト名がMongoClient
の構築時に指定されたホスト名と一致することを確認します。 アプリケーションのホスト名検証を無効にするには、 applytoSslSettings()
ビルダー ブロックでビルダーのinvalidHostNameAllowed
プロパティをtrue
に設定します。
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string URI>")) .applyToSslSettings { builder -> builder.enabled(true) builder.invalidHostNameAllowed(true) } .build() val mongoClient = MongoClient.create(settings);
警告
ホスト名検証を無効にすると、アプリケーションは安全でなくなり、有効なクライアントインスタンスとみなされる期限切れの証明書や外部プロセスに対して脆弱になる可能性があります。
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 構成をカスタマイズする
TLS 構成をカスタマイズする必要がある場合は、sslContext
MongoClient
SSLContext を渡すことで、context()
の プロパティを設定できます オブジェクトをapplyToSslSettings()
ブロック内の メソッド ビルダに渡すようにします。
val sslContext = SSLContext.getDefault() val settings = MongoClientSettings.builder() .applyToSslSettings { builder -> builder.enabled(true) builder.context(sslContext) } .build() val mongoClient = MongoClient.create(settings);
クラスの詳細については、 SSL コンテキスト の API ドキュメントを参照してください。SSLContext
オンライン証明書ステータスプロトコル (OCSP)
OCSP は、X. 509証明書が失効しているかどうかを確認するために使用される標準です。 証明機関は、有効期限が切れる前に X. 509証明書を証明書失効リスト(CRL)に追加して、証明書を無効にすることができます。 クライアントが TLS ハンドシェイク中に X. 509証明書を送信すると、CA の失効サーバーは CRL をチェックし、 good
、 revoked
、またはunknown
のステータスを返します。
ドライバーは、OCSP の次のバリエーションをサポートします。
クライアント駆動型 OCSP
OCSP ステープル
次のセクションでは、それらの違いと、アプリケーションでそれらを有効にする方法について説明します。
注意
Kotlin Sync ドライバーは、アプリケーション用に構成された 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 を有効にする方法
API ドキュメント
このガイドで説明したメソッドやタイプの詳細については、次の API ドキュメントを参照してください。