启用和配置 TLS
Overview
在本指南中,您可以了解如何使用TLS 协议保护与 MongoDB 部署的连接。 TLS 是一种加密协议,可保护应用程序与 MongoDB 之间的通信。 要将连接配置为使用 TLS,请启用 TLS 选项并在创建客户端时提供证书以进行验证。
本指南包括以下部分:
启用 TLS描述了在连接上启用TLS 的方法
配置证书描述配置 TLS 所需的证书
客户端中的参考证书提供了一个示例,说明如何创建
TlsOptions
结构来配置 TLS 选项附加信息提供了本指南中提到的类型和方法的资源和 API 文档链接
提示
要学习;了解有关 TLS 的更多信息,请参阅有关传输层安全性的维基百科条目。
启用 TLS
您可以通过以下方式之一在与 MongoDB 实例的连接上启用 TLS:
在连接字符串中将
tls
选项设置为true
将
ClientOptions
实例的tls
字段设置为具有空TlsOptions
结构的Tls::Enabled
变体,并使用这些选项实例化Client
从以下 Connection String和ClientOptions标签页中选择,查看相应的代码示例:
let uri = "mongodb://<hostname>:<port>?tls=true" let client = Client::with_uri_str(uri).await?;
let uri = "<connection string>" let mut client_options = ClientOptions::parse(uri).await?; let tls_opts = TlsOptions::builder().build(); client_options.tls = Some(Tls::Enabled(tls_opts)); let client = Client::with_options(client_options)?;
注意
如果您的连接字符串通过包含mongodb+srv
前缀来使用 DNS SRV 记录,则默认情况下会对您的连接启用 TLS。
有关客户端选项的完整列表,请参阅连接选项指南。
配置证书
要成功发起 TLS 请求,您的应用程序必须提供加密证书来证明其身份。 应用程序的证书必须存储为隐私增强邮件 (PEM) 文件,以便在连接到 MongoDB 部署时启用 TLS。 PEM 文件格式是加密证书的container格式。
重要
对于生产使用,我们建议您的 MongoDB 部署使用由同一证书颁发机构生成和签名的有效证书。 对于测试,您的部署可以使用自签名证书。
以下列表描述了客户端为建立启用 TLS 的连接而必须提供的组件:
TLS 组件 | 说明 |
---|---|
证书颁发机构 (CA) | 建立 TLS 连接时要信任的一个或多个证书颁发机构 |
客户端证书 | 数字证书,允许服务器验证应用程序的身份,以建立加密的网络连接 |
证书密钥 | 客户端证书私钥文件,通常包含在证书文件本身中 |
密码 | 用于解密客户端私钥(如果已加密)的密码 |
客户端中的参考证书
您必须在TlsOptions
结构中引用证书,以便服务器可以在客户端连接之前验证证书。
必须首先将证书文件路径转换为 PathBuf
类型,因此您必须从 std::path
模块导入此类型。然后,调用 TlsOptions
结构体的构建器函数,将 ca_file_path
和 cert_key_file_path
字段设置为证书文件路径。
在TlsOptions
实例中,您可以设置可选字段来配置连接上的 TLS。 出于测试目的,您可以设置allow_invalid_certificates
和allow_invalid_hostnames
字段。
将 allow_invalid_certificates
选项设置为 true
会禁用主机名验证,而将 allow_invalid_hostnames
设置为 true
会禁用证书验证。
警告
在生产环境中指定这两个选项都会导致应用程序不安全,并且可能容易受到过期证书和冒充有效客户端实例的外部进程的攻击。
例子
此示例执行以下操作来创建一个为 TLS 配置的TlsOptions
实例和Client
实例:
创建变量以引用
PathBuf
实例中的证书文件路径。实例化
TlsOptions
结构并将ca_file_path
和cert_key_file_path
字段设置为相关文件路径。将
TlsOptions
实例传递给Tls
枚举的Enabled
变体。将
ClientOptions
结构的tls
字段设置为包含TlsOptions
实例的Tls::Enabled
变体。使用这些选项创建一个
Client
实例。
use std::path::PathBuf; use mongodb::{ options::{ ClientOptions, TlsOptions, Tls }, Client }; async fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let mut client_options = ClientOptions::parse(uri).await?; let ca_file = PathBuf::from(r"<path to CA certificate>"); let key_file = PathBuf::from(r"<path to client certificate>"); let tls_opts = TlsOptions::builder().ca_file_path(ca_file).cert_key_file_path(key_file).build(); client_options.tls = Some(Tls::Enabled(tls_opts)); let _client = Client::with_options(client_options)?; Ok(()) }
更多信息
要了解有关在连接上启用 TLS 的更多信息,请参阅以下服务器手册文档:
API 文档
要进一步了解本指南所提及的任何方法或类型,请参阅以下 API 文档: