トランスポート層セキュリティ (TLS) の構成
項目一覧
Overview
このガイドでは、 TLS の使用方法を説明します。 プロトコルを使用して、 MongoDBデプロイへの接続を保護します。
接続に TLS を有効にすると、 C++ドライバーは次のアクションを実行します。
TLS を使用して MongoDB 配置に接続
配置の証明書を検証します
証明書が配置を認証することを確認する
MongoDBTLS 用の 配置の構成方法については、 マニュアルの「 TLS 構成ガイド MongoDB Server」を参照してください。
注意
このページでは、TLS/SSL に関する事前の知識と、有効な証明書にアクセスすることを前提としています。 TLS/SSL、PKI(公開鍵基盤)証明書、認証局(CA)の詳細な説明は、このドキュメントの範囲外です。
Tip
C++ドライバーは、ほとんどの TLS 動作をMongoDB Cドライバーに委任します。 構成手順や期待される動作など、 Cドライバーが TLS を処理する方法について詳しくは、 Cドライバーのドキュメントの「 TLS の構成」を参照してください。
TLS の有効化
インスタンスへの接続で TLSMongoDB tls
true
stringを有効にするには、次の例に示すように、 接続 で {0 接続オプションを に設定します。
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
Specify a CA File
TLS ハンドシェイク中に、MongoDB 配置は ID を確立するために、アプリケーションに証明書鍵ファイルを提示します。 通常、配置の証明書は既知の CA によって署名されており、アプリケーションはこの CA に依存して証明書を検証します。
ただし、テスト中は、独自の CA として動作する必要がある場合があります。 この場合、別の CA によって署名された証明書ではなく CA 証明書を使用するようにC++ドライバーに指示する必要があります。
そのためには、ルート証明書チェーンを含む.pem
ファイルへのパスを指定します。 これは、mongocxx::options::tls
オブジェクトにプロパティを設定する方法と、 接続stringで tlsCAFile
パラメータを使用する方法の 2 つがあります。
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.pem_file("/path/to/file.pem"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCAFile=/path/to/file.pem");
CA ディレクトリの指定
TLS サポートに OpenSSL または LiveSSL( libtls
)を使用している場合は、 C++ドライバーにディレクトリ内の CAファイルを検索するように指示することもできます。 ドライバーは、 tlsCAFile
またはpem_file
オプションで指定されたパスで CAファイルを見つけられない場合、このディレクトリを検索します。
次のコード例は、 ca_dir
オプションを使用してドライバーが検索するディレクトリを指定する方法を示しています。
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.ca_dir("/path/to/search/"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
Tip
このオプションは、OpenSSL SSL_CTX_load_verify_locations に対応します パラメータと LiveSSL tls_config_set_ca_path 許可されます。
証明書の失効を確認する
X. 509証明書が信頼できなくなった場合(例、秘密キーが侵害された場合)、CA は証明書を取り消します。 C++ドライバーには、サーバーの証明書が失効しているかどうかを確認する 2 つの方法が含まれています。
OCSP
オンライン証明書ステータスプロトコル (OCSP) プロセスは、接続しているMongoDB Serverのバージョンによって異なります。
MongoDB v 4.4以降:サーバーはタイムスタンプ付きの OCSP 応答を証明書にステープリングします。 C++ドライバーは、OCSP 応答に対して証明書を検証します。 CA によって証明書が取り消されている場合、または OCSP 応答がその他の方法で無効な場合、TLS ハンドシェイクは失敗します。
MongoDB v 4.3またはそれ以前:サーバーは OCSP エンドポイントを提供し、 C++ドライバーはこのエンドポイントに直接アクセスします。 次に、 C++ドライバーは OCSP 応答に対して証明書を検証します。 CA が証明書を失効していない場合、OCSP 応答が無効または不正であっても、TLS ハンドシェイクは続行されます。
C++ドライバーが OCSP エンドポイントと接続するのを停止するには、次のコード例に示すように、 接続stringで tlsDisableOCSPEndpointCheck
接続オプションを true
に設定します。
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsDisableOCSPEndpointCheck=true");
証明書失効リスト
OCSP を使用する代わりに、 C++ドライバーに指示して、CA によって公開された証明書失効リスト(CRL)でサーバーの証明書を確認できます。
次のコード例は、 crl_file
オプションを使用して CA からの.pem
ファイルへのパスを指定する方法を示しています。
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.crl_file("/path/to/file.pem"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
Tip
CRLファイルは、 .pem
または.der
形式で指定できます。
クライアント証明書の提示
一部のMongoDB配置では、接続するすべてのアプリケーションが ID を証明するクライアント証明書を提示する必要があります。 C++ドライバーが提示するクライアント証明書を指定するには、証明書と秘密キーを含む.pem
ファイルのファイルパスを指定します。
これは、mongocxx::options::tls
オブジェクトにプロパティを設定する方法と、 接続stringで tlsCertificateKeyFile
パラメータを使用する方法の 2 つがあります。
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.pem_file("/path/to/file.pem"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem");
重要
クライアント証明書と秘密キーは同じ.pem
ファイル内になければなりません。 異なるファイルに保存されている場合は、それらを連結する必要があります。 次の例は、キー ファイルと証明書ファイルを Unix システム上のcombined.pem
という 3 つ目のファイルに連結する方法を示しています。
cat key.pem cert.pem > combined.pem
キー パスワードの入力
証明書ファイル内の秘密キーが暗号化されている場合は、パスワードを入力する必要があります。 これは、mongocxx::options::tls
オブジェクトにプロパティを設定する方法と、 接続stringで tlsCertificateKeyFilePassword
パラメータを使用する方法の 2 つがあります。
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.pem_file("/path/to/file.pem"); tls_options.pem_password("<password>"); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem&tlsCertificateKeyFilePassword=<password>");
AllowInsecureTls
TLS が有効になっている場合、 C++ドライバーはサーバーが提示する証明書を自動的に検証します。 コードをテストするときは、この検証を無効にできます。 これは安全でない TLS と呼ばれます。
安全でない TLS が有効になっている場合、ドライバーは X. 509証明書の提示のみを必要としサーバー。 次のいずれかに当てはまる場合でも、ドライバーは証明書を受け入れます。
サーバーのホスト名と証明書のサブジェクト名(またはサブジェクトの別名)が一致しません。
証明書の有効期限が切れているか、まだ有効ではありません。
証明書のチェーン内に信頼できるルート証明書がありません。
証明書の目的がサーバー識別には無効です。
注意
安全でない TLS が有効になっている場合でも、クライアントとサーバー間の通信は TLS で暗号化されます。
安全でない TLS を有効にするには、次のコード例に示すように、 接続stringで tlsInsecure
接続オプションを true
に設定します。
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true");
証明書の検証のみを無効にするには、 tlsAllowInvalidCertificates
オプションをtrue
に設定し、 tlsInsecure
オプションをfalse
に設定します(または省略)。
mongocxx::options::client client_options; mongocxx::options::tls tls_options; tls_options.allow_invalid_certificates(true); client_options.tls_opts(tls_options); mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true"); mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidCertificates=true");
ホスト名検証のみを無効にするには、 tlsAllowInvalidHostnames
オプションをtrue
に設定し、 tlsInsecure
オプションをfalse
に設定します(または省略)。
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidHostnames=true");
警告
本番環境では を使用しないでください
本番環境では、 tlsInsecure
、 tlsAllowInvalidCertificates
、 tlsAllowInvalidHostnames
オプションは常にfalse
に設定します。
本番環境でこれらのオプションのいずれかをtrue
に設定すると、アプリケーションは安全でなくなり、期限切れの証明書や有効なクライアント インスタンスとみなされる外部プロセスに対して脆弱になる可能性があります。
API ドキュメント
C++ドライバーの TLS 構成の詳細については、次のAPIドキュメントを参照してください。