Docs Menu
Docs Home
/ / /
Node.js ドライバー
/ /

接続での TLS の有効化

項目一覧

  • Overview
  • TLS の有効化
  • 証明書の構成
  • クライアントでの証明書の参照
  • 証明書を保存するための SecureContext オブジェクトの作成
  • 証明書ファイルパスの指定
  • 証明書を保存するためのバッファ オブジェクトの作成
  • SecureContext の例
  • 詳細情報
  • API ドキュメント

このガイドでは、TLS セキュリティ プロトコルを使用して MongoDB インスタンスに接続する方法を学習できます。

TLS を使用するように接続を構成するには、TLS オプションを有効にし、検証用の証明書を提供します。

Tip

TLS について詳しくは、Wikipedia で トランスポート層セキュリティに関するエントリを参照してください。

MongoDB インスタンスへの接続で TLS を有効にするには、次の方法があります。

  • MongoClientOptionsオブジェクトで tlsオプションをtrueに設定する

  • 接続stringで tls オプションを true に設定する

MongoClientOptionsオブジェクトでtlstrueに設定すると、 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 を構成するための他のオプションが用意されています。 テスト目的では、 tlsAllowInvalidHostnamestlsAllowInvalidCertificatestlsInsecureクライアント オプションを設定できます。

tlsAllowInvalidHostnamesオプションをtrueに設定するとホスト名検証が無効になり、 tlsAllowInvalidCertificatestrueに設定すると証明書の検証が無効になります。 tlsInsecureオプションをtrueに設定すると、証明書とホスト名の両方の検証が無効になります。

警告

実稼働環境でこれらのオプションのいずれかを指定すると、アプリケーションは安全でなくなり、期限切れの証明書や有効なクライアントインスタンスをみなした外部プロセスに対して脆弱になる可能性があります。

クライアント オプションの完全なリストについては、「 接続オプション 」を参照してください。

TLS 要求を正常に開始するには、アプリケーションが暗号化証明書を参照して ID を証明する必要があります。 TLS を使用して MongoDB に接続するには、証明書を PEM ファイルとして保存する必要があります。

重要

実稼働環境で使用する場合は、MongoDB の配置に、同一の認証局によって生成および署名された有効な証明書を使用することをお勧めします。 テストには、自己署名証明書を使用できます。

次のリストでは、TLS との接続を確立するために必要なコンポーネントについて説明します。

TLS コンポーネント
説明

認証局(CA)

TLS 接続を行う場合、信頼する 1 つ以上の証明書機関。

クライアント証明書

暗号化されたネットワーク接続を確立するためにアプリケーションの ID をサーバーが確認できるようにするデジタル証明書とキー。

証明書鍵

クライアント証明書秘密キー ファイル。 このキーは、多くの場合、証明書ファイル自体に含まれています。

パスフレーズ

プライベートクライアントキーが暗号化されている場合、復号化するためのパスワード。

クライアントが接続する前にサーバーが証明書を検証できるように、 MongoClientOptionsオブジェクトで証明書を参照する必要があります。 証明書は、次の方法で参照できます。

  • 証明書を保存するためのSecureContextオブジェクトの作成(推奨)

  • 証明書を指すファイルパス文字列を指定する

  • 証明書を保存するためのBufferオブジェクトの作成

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オブジェクトと 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 を有効にする方法の詳細については、次のサーバー マニュアル ドキュメントを参照してください。

戻る

ネットワーク圧縮