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