配置传输层安全(TLS)
在本页中
概述
在本指南中,您可以了解如何使用TLS 协议以确保您与 MongoDB 部署的连接安全。
当您启用连接的 TLS 时,C 驱动程序将执行以下操作
使用 TLS 连接到 MongoDB 部署
验证部署的证书
确保证书验证了部署
要了解如何为 MongoDB 部署配置 TLS,请参阅 MongoDB 服务器手册中的 TLS 配置指南。
注意
关于 TLS/SSL、PKI(公钥基础设施)证书和证书颁发机构(CA)的完整描述超出了本文档的范围。本页面假定您已了解 TLS/SSL 并有权访问有效证书。
启用 TLS
您可以通过以下方式在 MongoDB 实例的连接上启用 TLS
设置
tls
参数在您的连接字符串中使用
mongoc_uri_set_option_as_bool()
函数将MONGOC_URI_TLS
连接选项设置为true
mongoc_client_t *client = mongoc_client_new ("mongodb+srv://<db_username>:<db_password>@<hostname>/?tls=true"); // Do database work here mongoc_client_destroy (client);
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017"); mongoc_uri_set_option_as_bool (uri, MONGOC_URI_TLS, true); mongoc_client_t *client = mongoc_client_new_from_uri (uri); // Do database work here mongoc_client_destroy (client); mongoc_uri_destroy (uri);
提示
如果您的连接字符串包含 +srv
修改,该修改指定了 SRV 连接格式,则默认启用 TLS。
要了解更多关于 SRV 连接格式的信息,请参阅 MongoDB 服务器文档中的 SRV 连接格式。
指定CA文件
当使用TLS连接到启用TLS的MongoDB部署时,默认情况下,部署将要求客户端提供由证书颁发机构签发的客户端证书,或者服务器上使用的本地证书存储信任的机构签发的证书。
您可以通过以下方式提供客户端证书
将连接字符串中的
tlscertificatekeyfile
参数设置为包含根证书链的.pem
文件使用
mongoc_uri_set_option_as_utf8()
函数将MONGOC_URI_TLSCERTIFICATEKEYFILE
选项设置为包含根证书链的.pem
文件
mongoc_client_t *client = mongoc_client_new ("mongodb+srv://<db_username>:<db_password>@<hostname>/?tls=true&tlscertificatekeyfile=/path/to/certs/client-certificate.pem"); // Do database work here mongoc_client_destroy (client);
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017"); mongoc_uri_set_option_as_bool (uri, MONGOC_URI_TLS, true); mongoc_uri_set_option_as_utf8 (uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "/path/to/client-certificate.pem"); mongoc_client_t *client = mongoc_client_new_from_uri (uri); // Do database work here mongoc_client_destroy (client); mongoc_uri_destroy (uri);
服务器证书验证
MongoDB C驱动程序将自动验证由配置的证书颁发机构签发的服务器证书的有效性。驱动程序还执行主机名验证和吊销检查。
要覆盖此行为,可以禁用主机名验证、OCSP端点吊销检查、所有吊销检查,并允许无效证书。
此行为由 tlsAllowInvalidHostnames
、tlsDisableOCSPEndpointCheck
、tlsDisableCertificateRevocationCheck
和 tlsAllowInvalidCertificates
选项控制。默认情况下,所有这些均设置为 false
。
不建议更改这些默认设置,因为您可能会使您的客户端面临以下安全风险
中间人攻击当设置
tlsAllowInvalidHostnames
时无效证书,当设置
tlsAllowInvalidCertificates
时可能被撤销的证书,当设置
tlsDisableOCSPEndpointCheck
或tlsDisableCertificateRevocationCheck
时
支持的库
默认情况下,libmongoc将尝试找到支持的TLS库并启用TLS支持。这由cmake标志ENABLE_SSL
控制,该标志默认设置为AUTO
。此标志接受以下值
AUTO
:链接到系统的原生TLS库,或尝试找到OpenSSL。这是默认值。OPENSSL
:链接到OpenSSL(libssl)。可以通过OPENSSL_ROOT
指定一个可选的安装路径。LIBRESSL
(已弃用):链接到LibreSSL的libtls。您可以通过设置OPENSSL
来链接到与LibreSSL兼容的libssl。WINDOWS
:链接到Windows的本地TLS库Secure Channel。DARWIN
:链接到macOS的本地TLS库Secure Transport。OFF
:禁用TLS支持。
OpenSSL
MongoDB C 驱动程序在 Linux 和 Unix 平台上使用 OpenSSL(macOS 除外)。行业最佳实践和一些法规要求使用 TLS 1.1 或更高版本,这需要至少 OpenSSL 1.0.1。使用以下命令检查您的 OpenSSL 版本
openssl version
确保您的系统 OpenSSL 是最新版本(至少 1.0.1),或者使用以下命令在非系统路径中安装最新版本并对其进行构建
cmake -DOPENSSL_ROOT_DIR=/absolute/path/to/openssl
当与 OpenSSL 编译时,驱动程序将尝试加载系统默认证书存储,这由发行版配置。可以通过设置 tlsCAFile
URI 选项或通过在 mongoc_ssl_opt_t. 中的 ca_file
和 ca_dir
字段来覆盖
当使用 OpenSSL 1.0.1+ 时,完全支持在线证书状态协议 (OCSP)。但是,当使用 mongoc_ssl_opt_t 和 crl_file
撤销服务器证书时,即使证书有一个有效的附加 OCSP 响应,证书也被视为已撤销。
提示
有关OCSP的更多信息,请参阅RFC 6960。
LibreSSL / libtls(已弃用)
当配置为针对openssl编译时,MongoDB C Driver通过使用OpenSSL兼容性检查支持LibreSSL。它还支持配置为针对libressl构建的新libtls
库。
当使用LibreSSL编译时,mongoc_ssl_opt_t的crl_file
选项不受支持,如果使用将报错。设置tlsDisableOCSPEndpointCheck
和tlsDisableCertificateRevocationCheck
无效。
在线证书状态协议(OCSP)部分支持,以下为注意事项:
必须 stapling 扩展(参见 RFC 7633)被忽略
如果客户端在没有 stapled 响应的情况下提交了 Must-Staple 证书,并且 OCSP 响应者已关闭,则连接将继续
如果客户端从 OCSP 响应者那里收到了吊销响应,则连接将不会继续
提示
有关OCSP的更多信息,请参阅RFC 6960。
Windows 上原生的 TLS 支持(安全通道)
MongoDB C 驱动程序支持 Windows 原生 TLS 库(安全通道或 SChannel)及其原生加密库(加密 API:下一代或 CNG)。
当与 Windows 原生库编译时,mongoc_ssl_opt_t 的 ca_dir
选项不受支持,如果使用则会引发错误。
使用tlsCertificateKeyPassword
URI选项设置的加密PEM文件也不受支持,尝试加载时将导致错误。
当设置tlsCAFile
时,驱动程序将只允许由一个或多个提供者签发的服务器证书。如果没有设置tlsCAFile
,驱动程序将使用System Local Machine Root
证书存储来查找证书授权机构,以确认提供的证书。
当使用mongoc_ssl_opt_t将crl_file
设置后,驱动程序将撤销列表导入到System Local Machine Root
证书存储。
设置tlsDisableOCSPEndpointCheck
没有效果。
在线证书状态协议(OCSP)部分支持,以下为注意事项:
必须安装扩展(见RFC 7633)被忽略。
如果没有 stapled 响应且 OCSP 响应者不可用,连接将继续,即使提供了必须安装的证书。
如果客户端从 OCSP 响应者收到撤销响应,则连接不会继续。
当使用 mongoc_ssl_opt_t 将
crl_file
设置为,并且crl_file
撤销了服务器的证书时,OCSP 响应优先。例如,如果服务器提供了一个有效的附加 OCSP 响应的证书,即使crl_file
将其标记为已撤销,证书也被认为是有效的。
提示
有关OCSP的更多信息,请参阅RFC 6960。
macOS / Darwin(Secure Transport)上的原生 TLS 支持
MongoDB C 驱动程序同时支持 Darwin 原生 TLS 库和其原生加密库 Common Crypto。
当与 Secure Transport 编译时,不支持 mongoc_ssl_opt_t 的 ca_dir
和 crl_file
选项。如果使用任一选项,将引发错误。
当设置 tlsCAFile
时,驱动程序将只允许由提供(或提供者)的权威机构签发的服务器证书。如果没有设置 tlsCAFile
,驱动程序将使用未锁定的密钥链中的证书权威机构。
设置 tlsDisableOCSPEndpointCheck
和 tlsDisableCertificateRevocationCheck
在针对安全传输编译时没有效果。
在线证书状态协议(OCSP)部分支持,以下是一些注意事项。
必须 stapling 扩展(参见 RFC 7633)被忽略
如果客户端在没有 stapled 响应的情况下提交了 Must-Staple 证书,并且 OCSP 响应者已关闭,则连接将继续
如果客户端从 OCSP 响应者那里收到了吊销响应,则连接将不会继续
提示
有关OCSP的更多信息,请参阅RFC 6960。
API 文档
有关本指南中提到的对象和函数的更多信息,请参阅以下 API 文档