对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

配置传输层安全 (TLS)

在本指南中,您可以学习;了解如何使用TLS协议保护与MongoDB 部署的连接。

为连接启用TLS 时, C++驱动程序会执行以下操作:

  • 使用 TLS 连接到 MongoDB 部署

  • 验证部署的证书

  • 确保证书证明部署

要学习;了解如何为 TLS 配置MongoDB 部署,请参阅MongoDB Server手册中的TLS 配置指南

注意

本页假设您已了解 TLS/SSL 并可访问权限有效证书。 TLS/SSL、PKI(公钥基础设施)证书和证书颁发机构 (CA) 的完整描述超出了本文档的范围。

提示

C++驱动程序将大多数 TLS 行为委托给MongoDB C驱动程序。有关 C 驱动程序如何处理 TLS 的信息,包括配置步骤和预期行为,请参阅C 驱动程序文档中的配置 TLS

要为与MongoDB实例的连接启用TLS,请在连接string中将 tls 连接选项设立为 true,如以下示例所示:

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");

提示

如果您的连接string包含 +srv 修饰符(指定 SRV 连接格式),则默认情况下会对您的连接启用 TLS。

要学习;了解有关 SRV 连接格式的更多信息,请参阅MongoDB Server文档中的SRV 连接格式

在 TLS 握手期间,MongoDB 部署会向您的应用程序提供证书密钥文件,以确定其身份。 通常,部署的证书由知名 CA 签名,并且您的应用程序依赖此 CA 来验证证书。

但是,在测试过程中,您可能希望充当自己的 CA。在这种情况下,您必须指示C++驱动程序使用您的 CA 证书,而不是其他 CA 签名的证书。

为此,请指定包含根证书链的.pem文件的路径。 您可以通过两种方式执行此操作:在 mongocxx::options::tls对象上设置属性,或在连接string中使用 tlsCAFile 参数。

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");

如果使用 OpenSSL 或 LibreSSL (libtls) 来支持TLS,还可以指示C++驱动程序在目录中搜索CA文件。如果驱动程序在 tlsCAFilepem_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);

提示

此选项对应于 OpenSSL SSL_CTX_load_verify_locations 参数和 LibreSSL tls_config_set_ca_path 参数。

当 X.509 证书不再可信时(示例,如果其私钥已泄露),CA 将撤销该证书。C++驱动程序提供两种检查服务器证书是否已撤销的方法。

在线证书状态协议 (OCSP)进程因要连接的MongoDB Server版本而异:

  • MongoDB v4.4 或更高版本:服务器将带时间戳的 OCSP 响应装订到其证书中。C++驱动程序根据 OCSP 响应验证证书。如果 CA 已撤销证书,或者 OCSP 响应无效,则 TLS 握手失败。

  • MongoDB v4.3 或更早版本: 服务器提供C++驱动程序直接联系的 OCSP 终结点。然后, C++驱动程序会根据 OCSP 响应来验证证书。如果 CA 尚未吊销证书,则即使 OCSP 响应无效或格式不正确,TLS 握手也会继续。

注意

Let's Encrypt OCSP 弃用

Let's Encrypt 已终止对较新证书的 OCSP支持。 Let's Encrypt 颁发的新证书可能不包含 OCSP 响应程序URL。仅当证书包含 OCSP URI 时,才会进行 OCSP 吊销检查,因此缺少 OCSP URL是正常情况,并不一定表示MongoDB 部署有问题。

要阻止 C++ 驱动程序联系 OCSP 终结点,请在连接字符串中将 tlsDisableOCSPEndpointCheck 连接选项设立为 true,如以下代码示例所示:

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsDisableOCSPEndpointCheck=true");

您可以指示 C++ 驱动程序根据 CA 发布的证书吊销列表 (CRL) 检查服务器的证书,而不是使用 OCSP。

以下代码示例演示如何使用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);

提示

您可以采用.pem.der格式指定 CRL文件。

某些MongoDB部署要求每个连接的应用程序提供证明其身份的客户端证书。要指定 C++ 驱动程序要提供的客户端证书,请指定包含证书和私钥的 .pem 文件的文件路径。

您可以通过两种方式执行此操作:在 mongocxx::options::tls对象上设置属性,或在连接string中使用 tlsCertificateKeyFile 参数。

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的第三个文件中:

$ cat key.pem cert.pem > combined.pem

如果证书文件中的私钥已加密,则必须提供密码。 您可以通过两种方式执行此操作:在 mongocxx::options::tls对象上设置属性,或在连接string中使用 tlsCertificateKeyFilePassword 参数。

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>");

启用 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");

警告

不要在生产中使用

在生产环境中,始终将tlsInsecuretlsAllowInvalidCertificatestlsAllowInvalidHostnames选项设置为false

在生产环境中将这些选项中的任何一个设置为true都会导致应用程序不安全,并且可能容易受到过期证书和冒充有效客户端实例的外部进程的攻击。

要学习有关为 C++ 驱动程序配置 TLS 的更多信息,请参阅以下 API 文档: