トランスポート層セキュリティ (TLS) の構成
項目一覧
Overview
このガイドでは、TLS(Transport Layer Security)プロトコルを使用してMongoDBデプロイへの接続を保護する方法を説明します。
接続に TLS を有効にすると、 Scalaドライバーは次のアクションを実行します。
TLS を使用して MongoDB 配置に接続
配置の証明書を検証します
TLS 用のMongoDBデプロイの構成方法については、 MongoDB Serverマニュアルの TLS 構成ガイドを参照してください。
注意
このページでは、TLS/SSL に関する事前の知識と、有効な証明書にアクセスすることを前提としています。 TLS/SSL、PKI(公開鍵基盤)証明書、認証局(CA)の詳細な説明は、このドキュメントの範囲外です。 TLS の詳細については、 Wikipedia の トランスポート層セキュリティ に関するエントリを参照してください。
TLS の有効化
MongoDBデプロイへの接続に TLS を有効にするには、次の方法があります。
MongoClientSettings
インスタンスの作成時に、SslSettings.Builder
クラスのenabled()
メソッドを使用します接続 URI で
tls
パラメータを設定する
TLS を有効にする対応するコードを確認するには、MongoClientSettings または Connection URIタブを選択します。
val tlsUri = "mongodb://localhost:27017/" val tlsSettings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(tlsUri)) .applyToSslSettings(builder => builder.enabled(true)) .build() val tlsClient1 = MongoClient(tlsSettings)
val tlsClient2 = MongoClient("mongodb://localhost:27017/?tls=true")
証明書の構成
注意
これらのセクションの手順は、 Oracle JDK のドキュメントに基づいています。 JDK またはカスタム TLS/SSL実装には適用されない可能性があります。
TLS リクエストを開始するScalaアプリケーションは、アプリケーションの ID を証明し、 Scalaアプリケーションが対話する他のアプリケーションを検証する暗号化証明書にアクセスする必要があります。アプリケーション内でこれらの証明書へのアクセスを次の方法で構成できます。
JVMトラスト ストアとJVMキー ストアの使用
クライアント固有のトラスト ストアとキー ストアを使用する
JVM トラスト ストアを構成する
JVM信頼ストアには、 Scalaアプリケーションが対話する他のアプリケーションを安全に識別する証明書が保存されます。これらの証明書を使用することで、アプリケーションは別のアプリケーションへの接続が本物であり、第三者による改ざんから安全であることを証明できます。
Javaランタイム環境(JRE)は、署名機関からの一般的に使用される公開証明書を含むデフォルトの証明書ストアを提供します。 MongoDBデプロイで、 JRE のデフォルトの証明書ストアに存在しない認証局によって署名された証明書を使用する場合、アプリケーションはTLS 要求を開始するために次のシステム プロパティを構成する必要があります。
javax.net.ssl.trustStore
: 署名機関の証明書を含むトラスト ストアへのパスjavax.net.ssl.trustStorePassword
:javax.net.ssl.trustStore
プロパティで定義されたトラスト ストアにアクセスするためのパスワード
上記のプロパティを定義するには、 keytoolコマンドラインツールを使用できます。次の例では、 keytool
コマンドを実行して、認証局ファイルパス、トラスト ストア パス、トラスト ストア パスワードを指定します。
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <trust store password>
JVM キー ストアを構成する
注意
デフォルトでは、MongoDB インスタンスはクライアント証明書の検証を実行しません。MongoDB インスタンスをクライアント証明書を検証するように構成した場合は、キー ストアを構成する必要があります。
TLS 要求を開始するアプリケーションは、クライアントが MongoDB サーバーに TLS 証明書を提示するように、次の JVM システム プロパティを設定する必要があります。
javax.net.ssl.keyStore
: クライアントの TLS/SSL 証明書を含むキーストアへのパスjavax.net.ssl.keyStorePassword
: で定義されたキー ストアにアクセスするためのパスワードjavax.net.ssl.keyStore
次のキー ツール を使用してキー ストアを作成できます: または Opensl コマンドライン ツール。
TLS を使用してScalaアプリケーションを構成する方法の詳細については、 Java言語ドキュメントの「 JSSE リファレンス ガイド 」を参照してください。
クライアント固有の信頼ストアとキー ストアを構成する
クライアント固有のトラスト ストアとキー ストアを構成するには、 SSLContext
クラスのinit()
メソッドを使用します。
SSLContext
インスタンスを使用するようにクライアントを構成する例については、このガイドの「 SSLContext を使用した構成のカスタマイズ 」セクションを参照してください。
ホスト名検証を無効化する
デフォルトでは 、ドライバーはサーバーの TLS 証明書に含まれるホスト名が MongoClient
の構築時に指定されたホスト名と一致することを確認します。ホスト名検証は、次の方法で無効にできます。
MongoClientSettings
インスタンスの作成時にSslSettings.Builder
クラスのinvalidHostNameAllowed()
メソッドを使用する接続 URI で
tlsAllowInvalidHostnames
パラメータを設定する
ホスト名検証を無効にする対応するコードを確認するには、MongoClientSettings タブまたは Connection URIタブを選択します。
val invalidHostUri = "mongodb://localhost:27017/" val invalidHostSettings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(invalidHostUri)) .applyToSslSettings(builder => builder .enabled(true) .invalidHostNameAllowed(true) ) .build() val invalidHostClient1 = MongoClient(invalidHostSettings)
val invalidHostClient2 = MongoClient("mongodb://localhost:27017/?tls=true&tlsAllowInvalidHostnames=true")
警告
ホスト名検証を無効にすると、アプリケーションは安全でなくなり、有効なクライアントインスタンスとみなされる期限切れの証明書や外部プロセスに対して脆弱になる可能性があります。
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 を使用できるように、新しいリリースにアップグレードしてください。
SSLContext で構成をカスタマイズする
TLS 構成をカスタマイズする必要がある場合は、MongoClient
オブジェクトの sslContext
プロパティを設定できます。次のコードに示すように、applyToSslSettings()
ブロック内の context()
メソッド ビルダに SSLContext
オブジェクトを渡します。
val sslContext = SSLContext.getDefault() val contextSettings = MongoClientSettings.builder() .applyToSslSettings(builder => builder .enabled(true) .context(sslContext) ) .build() val mongoClient = MongoClient(contextSettings);
クラスの詳細については、 SSL コンテキスト の API ドキュメントを参照してください。SSLContext
オンライン証明書ステータスプロトコル (OCSP)
OCSP は、X.509 証明書が失効しているかどうかを確認するために使用される標準です。証明機関(CA)は、有効期限が切れる前に X.509 証明書を証明書失効リスト(CRL)に追加して、証明書を無効にすることができます。クライアントがTLS ハンドシェイク中に X.509 証明書を送信すると、CA の失効サーバーはCRL をチェックし、good
、revoked
、または unknown
のステータスを返します。
ドライバーは、OCSP の次のバリエーションをサポートします。
クライアント駆動型 OCSP
OCSP ステープル
次のセクションでは、これらのバリエーションについて説明し、アプリケーションでそれを有効にする方法を示します。
注意
Scalaドライバーは、アプリケーション用に構成されたJVM引数を使用します。これは、特定の MongoClient
インスタンスではオーバーライドできません。
クライアント駆動型 OCSP
クライアント駆動型 OCSP では、クライアントはサーバーから証明書を受信し、この証明書を OCSPリクエストで OCSP レスポンダーに送信します。 OCSP レスポンダは、CA を使用して証明書のステータスを確認し、その有効性に関するレポートをクライアントに送信します。
アプリケーションでクライアント駆動型 OCSP を有効にするには、次の JVM システム プロパティを設定します。
プロパティ | 説明 |
---|---|
| 失効チェックを有効にするには、このプロパティを |
| クライアント駆動型 OCSP を有効にするには、このプロパティを |
警告
OCSP レスポンダーが利用できない場合、JDK によって提供される TLS サポートは「ハード フェイル」を報告します。これは、MongoDB Shell や他のドライバーの「ソフト フェイル」動作とは異なります。
OCSP ステープル
OCSP ステープリングは、サーバーがCA から署名された証明書を取得し、それをクライアントへのタイムスタンプ付きの OCSP 応答に含める必要があるメカニズムです。
アプリケーションで OCSP ステープルを有効にするには、次の JVM システム プロパティを設定します。
プロパティ | 説明 |
---|---|
| 失効チェックを有効にするには、このプロパティを |
| 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 の詳細については、次のリソースを参照してください。
API ドキュメント
このガイドで説明した型の詳細については、次のAPIドキュメントを参照してください。