接続での TLS の有効化
項目一覧
Overview
このガイドでは、TLS セキュリティ プロトコルを使用して MongoDB インスタンスに接続する方法を学習できます。
TLS を使用するように接続を構成するには、TLS オプションを有効にし、検証用の証明書を提供します。
Tip
TLS について詳しくは、Wikipedia で トランスポート層セキュリティに関するエントリを参照してください。
TLS の有効化
MongoDB インスタンスへの接続で TLS を有効にするには、次の方法があります。
MongoClientOptions
オブジェクトでtls
オプションをtrue
に設定する接続stringで
tls
オプションをtrue
に設定する
MongoClientOptions
オブジェクトでtls
をtrue
に設定すると、 MongoClient
インスタンスは TLS に接続できます。
const client = new MongoClient(uri, { tls: true });
接続stringで tls
オプションを true
に設定すると、MongoClient
インスタンスは TLS に接続できます。
const uri = "mongodb://<hostname>:<port>?tls=true"; const client = new MongoClient(uri, myClientSettings);
注意
MongoDBに接続するときに 接続stringで +srv
変更を指定して DNS SRV レコードを使用する場合は、接続で TLS がデフォルトで有効になります。 これを無効にするには、接続stringまたは MongoClientOptions
オブジェクトで tls
または ssl
パラメータの値を false
に設定します。
DNS シードリストを使用する場合の接続動作の詳細については、サーバー マニュアルの「 SRV 接続形式」セクションを参照してください。
注意
「安全でないレガシー再ネゴシエートが無効になっている」エラーの回避策
Node.jsドライバーはデフォルトで OpenSSL に依存します。古い SSL プロキシは、OpenSSL 3.0 以降を使用している環境で unsafe legacy renegotiation disabled
エラーを発生させる可能性があります。このエラーは、次の例に示すように、SSL_OP_LEGACY_SERVER_CONNECT
オプションを設定することで解決できます。
import { MongoClient } from 'mongodb'; import crypto from 'crypto'; const client = new MongoClient("mongodb+srv://...", { secureContext: { secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT } });
tls
クライアント オプションに加えて、ドライバーには接続で TLS を構成するための他のオプションが用意されています。 テスト目的では、 tlsAllowInvalidHostnames
、 tlsAllowInvalidCertificates
、 tlsInsecure
クライアント オプションを設定できます。
tlsAllowInvalidHostnames
オプションをtrue
に設定するとホスト名検証が無効になり、 tlsAllowInvalidCertificates
をtrue
に設定すると証明書の検証が無効になります。 tlsInsecure
オプションをtrue
に設定すると、証明書とホスト名の両方の検証が無効になります。
警告
実稼働環境でこれらのオプションのいずれかを指定すると、アプリケーションは安全でなくなり、期限切れの証明書や有効なクライアントインスタンスをみなした外部プロセスに対して脆弱になる可能性があります。
クライアント オプションの完全なリストについては、「 接続オプション 」を参照してください。
証明書の構成
TLS 要求を正常に開始するには、アプリケーションが暗号化証明書を参照して ID を証明する必要があります。 TLS を使用して MongoDB に接続するには、証明書を PEM ファイルとして保存する必要があります。
重要
実稼働環境で使用する場合は、MongoDB の配置に、同一の認証局によって生成および署名された有効な証明書を使用することをお勧めします。 テストには、自己署名証明書を使用できます。
次のリストでは、TLS との接続を確立するために必要なコンポーネントについて説明します。
TLS コンポーネント | 説明 |
---|---|
認証局(CA) | TLS 接続を行う場合、信頼する 1 つ以上の証明書機関。 |
クライアント証明書 | 暗号化されたネットワーク接続を確立するためにアプリケーションの ID をサーバーが確認できるようにするデジタル証明書とキー。 |
証明書鍵 | クライアント証明書秘密キー ファイル。 このキーは、多くの場合、証明書ファイル自体に含まれています。 |
パスフレーズ | プライベートクライアントキーが暗号化されている場合、復号化するためのパスワード。 |
Tip
PEM 形式の詳細については、 Wikipedia の プライバシーが強化されたメール に関するエントリを参照してください。
クライアントでの証明書の参照
クライアントが接続する前にサーバーが証明書を検証できるように、 MongoClientOptions
オブジェクトで証明書を参照する必要があります。 証明書は、次の方法で参照できます。
証明書を保存するための
SecureContext
オブジェクトの作成(推奨)証明書を指すファイルパス文字列を指定する
証明書を保存するための
Buffer
オブジェクトの作成
証明書を保存するための SecureContext オブジェクトの作成
TLS 接続を構成するには、 secureContext
オプションを使用することを推奨します。 SecureContext
オブジェクトは Node.js のネイティブであり、すべての TLS オプションを単一の再利用可能なオブジェクトに保持できます。
SecureContext
オブジェクトを作成するには、 tls
モジュールからcreateSecureContext()
メソッドをインポートします。 次に、 createSecureContext()
メソッドを呼び出し、オプション パラメータで証明書の内容を渡します。 このメソッドは、SecureContext
オブジェクトで使用できるMongoClientOptions
オブジェクトを返します。
次のコードは、 SecureContext
オブジェクトを作成し、それをクライアントに渡す方法を示しています。
// Create a SecureContext object const secureContext = tls.createSecureContext({ ca: fs.readFileSync(`<path to CA certificate>`), cert: fs.readFileSync(`<path to public client certificate>`), key: fs.readFileSync(`<path to private client key>`), }); // Pass the SecureContext as a client option const client = new MongoClient(uri, { tls: true, secureContext });
createSecureContext()
メソッドとtls
パッケージの詳細については、 Node.js TLS API ドキュメントを参照してください。
SecureContext
オブジェクトを使用する実行可能な例については、「 SecureContext の例え 」を参照してください。
証明書ファイルパスの指定
TLS に接続しているときに証明書を取得するためのクライアント オプションとして証明書のファイルパスを含めることができます。 MongoClient
インスタンスでconnect()
メソッドを呼び出すと、ドライバーはこれらのファイルを読み取ります。
次のコードは、 MongoClient
で証明書ファイルパスをオプションとして指定する方法を示しています。
// Pass filepaths as client options const client = new MongoClient(uri, { tls: true, tlsCAFile: `<path to CA certificate>`, tlsCertificateKeyFile: `<path to private client key>`, });
注意
CRL ファイル
TLS 構成では、MongoDB に接続するときに証明書失効リスト(CRL)を提示する必要がある場合があります。 ドライバーのバージョン 6.0 以降では、CRL ファイルのファイルパスを接続stringまたは MongoClientOptions
インスタンスの tlsCRLFile
オプションに渡すことができます。
証明書を保存するためのバッファ オブジェクトの作成
TLS に接続するには、クライアント オプションで証明書ファイルの内容をBuffer
オブジェクトとして渡します。
次のコードは、証明書ファイルの内容を読み取り、結果のBuffer
オブジェクトをMongoClient
のオプションとして渡す方法を示しています。
// Read file contents const ca = fs.readFileSync(`<path to CA certificate>`); const cert = fs.readFileSync(`<path to public client certificate>`); const key = fs.readFileSync(`<path to private client key>`); // Pass Buffers as client options const client = new MongoClient(uri, { tls: true, ca, cert, key });
SecureContext の例
この例では、 SecureContext
オブジェクトと TLS オプションを含むMongoClient
インスタンスを作成する方法を示します。 この例では MongoDB に接続し、検索クエリを実行します。
import { MongoClient } from "mongodb"; import * as fs from "fs"; import * as tls from "tls"; // Replace the uri string with your connection string. const uri = "<connection uri>"; // Replace the filepaths with your certificate filepaths. const secureContext = tls.createSecureContext({ ca: fs.readFileSync(`<path to CA certificate>`), cert: fs.readFileSync(`<path to public client certificate>`), key: fs.readFileSync(`<path to private client key>`), }); // Create a client with the secureContext option const client = new MongoClient(uri, { tls: true, secureContext }); async function run() { try { const db = client.db("myDB"); const myColl = db.collection("myColl"); const doc = await myColl.findOne({}); console.log(doc); } finally { await client.close(); } } run().catch(console.dir);
詳細情報
接続で TLS を有効にする方法の詳細については、次のサーバー マニュアル ドキュメントを参照してください。