MongoDB Atlas为开发环境提供有效的 TLS 证书,但您可能需要使用自定义的安全配置来实现本地部署部署。本指南提供了为本地MongoDB 部署设置 TLS加密的说明,从而允许您创建与生产基础架构非常相似的安全测试环境。
使用具有 TLS 加密的 MongoDB Community Edition 或 Enterprise MongoDB 在本地使用,可为在部署之前开发、测试和验证应用程序的安全行为提供真实的环境。
本地 TLS 的自签名证书链
在生产环境中, MongoDB服务器使用由受信任的证书颁发机构 (CA) 签名的证书。对于本地开发,您可以使用以下任一选项:
商业或公共 CA 证书:如果您注册了域名,则可以从公认的证书颁发机构获取证书。
企业 CA 证书:如果您的组织维护私有证书颁发机构(例如 EJBCA 或 TinyCert),则可以通过 IT 部门请求证书。
免费 CA 证书:如果您有注册域名,Let's Encrypt 等服务可提供由证书颁发机构签名的免费证书。
自签名证书:对于隔离的本地开发环境,当其他选项不可用时,自签名证书链提供了实用的解决方案。
您可以使用以下步骤为本地MongoDB部署实现自签名证书链。通过创建自己的证书颁发机构和服务器证书,您可以模拟 TLS 加密连接,而无需外部服务。
重要
仅在隔离的开发环境中使用自签名证书链。自签名证书链不包含正确颁发的证书的信任验证机制,可能存在安全漏洞。切勿在生产中或处理敏感数据时使用自签名证书。
TLS 通信中的服务器证书
在安全通信中,服务器证书向连接的客户端证明服务器的身份,防止中间人攻击,并促进加密通信的安全密钥交换。
在典型的 TLS 握手中,客户端通过检查是否存在以下情况来验证服务器证书:
证书由受信任的证书颁发机构签名
证书有效、未过期或已撤销
证书中的服务器名称与正在连接的服务器匹配
仅当根 CA 证书和中间 CA 证书存在于客户端的本地信任存储中时,客户端才会接受这些证书。对于正确颁发的证书,只有颁发机构才能访问权限根证书的私钥,而绝不能通过服务器访问。
自签名证书链布局
对于使用自签名证书的本地MongoDB TLS设置,您需要创建和管理多个证书文件,这些文件在 TLS 握手中提供服务不同目的。
服务器要求:
自签名证书颁发机构 (CA) 证书,充当您自己的可信根。
自签名 CA 证书的私钥,用于签署服务器证书。
由您的自签名 CA 签署的服务器证书,用于标识您的MongoDB 服务器。
服务器证书的私钥,用于 TLS加密。
客户端要求:
自签名根 CA 证书,用于验证服务器的证书。
客户端证书及其私钥,可选,用于双向 TLS。
配置MongoDB时,请在服务器和客户端配置中指定这些证书文件的路径,以建立安全的 TLS 连接。
重要
在具有来自公认 CA 的证书的生产环境中,您无权访问权限根证书颁发机构的私钥。这是开发环境中自签名证书链的特殊例外情况。
创建自签名证书链
以下代码使用 openssl
命令行工具为MongoDB 部署创建完整的自签名证书链。此进程会创建所有必要的证书和密钥,并进行格式化以用于MongoDB。
# Creating self-signed CA cert and SAN cert for localhost # aka mdbinstance.mydevelopment.net #===================================================================================== openssl req -x509 -nodes -sha256 -days 1825 -newkey rsa:4096 \ -keyout rootCA.key -out rootCA.crt -subj="/CN=ca.mydevelopment.net" openssl req -newkey rsa:4096 -keyout server.key -nodes \ -out domain.csr -subj "/CN=server.mydevelopment.net" openssl req -x509 -nodes -CA rootCA.crt -CAkey rootCA.key -in domain.csr \ -out mdbinstance.mydevelopment.net.crt -days 3560 -nodes \ -subj '/CN=<mdbinstance_mydevelopment_net>' -extensions san -config <( \ echo '[req]'; \ echo 'distinguished_name=req'; \ echo '[san]'; \ echo 'subjectAltName=DNS:localhost,DNS:mdbinstance.mydevelopment.net') cat rootCA.key rootCA.crt >rootCAcombined.pem cat server.key mdbinstance.mydevelopment.net.crt >serverCert.pem
前面的命令执行以下操作:
创建根 CA 证书
rootCA.crt
及其私钥rootCA.key
为您的服务器生成证书签名请求或 CSR
为
localhost
和mdbinstance.mydevelopment.net
创建具有主题备用名称 (SAN) 的服务器证书将证书和密钥合并到MongoDB所需的 PEM 文件中
上述命令生成以下文件。
对于MongoDB Server配置:
rootCAcombined.pem
:组合的 CA 证书和私钥serverCert.pem
:组合的服务器证书和私钥
对于客户端应用程序:
rootCA.crt
:CA 证书,用于信任服务器证书serverCert.pem
:服务器证书及其私钥,用于 TLS 连接
MongoDB Server TLS 配置
生成证书后,配置MongoDB服务器以使用它们。以下配置显示了 mongod.conf
文件的 net
部分,重点关注 TLS 设置。
# network interfaces net: port: 27017 bindIp: 0.0.0.0 # Binds to all network interfaces - use only in secure networks tls: mode: requireTLS # Forces all connections to use TLS certificateKeyFile: /path/to/serverCert.pem # Server certificate with private key CAFile: /path/to/rootCAcombined.pem # CA certificate with private key
上述配置包括:
port
:标准MongoDB端口 27017bindIp
:设置为 0.0.0.0 以允许来自任何IP解决的连接,仅适用于安全专用网络上的开发环境tls.mode
:设置为requireTLS
以确保所有连接都使用 TLS加密certificateKeyFile
:服务器证书及其私钥的路径CAFile
:CA 证书及其私钥的路径
更新配置文件后,重新启动MongoDB服务器以应用TLS 设置。然后,您的MongoDB实例要求对所有连接使用 TLS。
使用 TLS 连接到MongoDB
以下示例演示如何与为 TLS 配置的MongoDB服务器建立连接。
mongosh --tls --tlsCAFile /path/to/rootCA.crt --tlsCertificateKeyFile \ /path/to/serverCert.pem 'mongodb://userid:password@hostname.domain'
对于MongoDB Compass连接,请对连接字符串中的证书路径进行URL编码。 示例,将正斜杠 (/) 转换为 %2F:
mongodb://userid:password@hostname.domain/?directConnection=true&tls=true&tlsCAFile=%2Fpath%2Fto%2FrootCA.crt&tlsCertificateKeyFile=%2Fpath%2Fto%2Fserver_certificate.pem
$mongodb_client = new MongoDB\Client($mongodb_uri, [ 'tls' => true, # Enable TLS for the connection 'tlsCAFile' => $mongodb_ca_cert_path, # Path to your CA certificate 'tlsCertificateKeyFile' => $mongodb_cert_path # Path to your client certificate ] );
对于所有客户端,您需要提供:
启用TLS 的选项
用于信任服务器的 CA 证书的路径
(可选)对于双向 TLS,客户端证书的路径
测试连接可确认 TLS设置正常工作。如果连接成功,则表示您的MongoDB 部署将受到 TLS加密的保护。
使用受信任的证书颁发机构
虽然自签名证书适用于开发,但生产环境应使用来自受信任证书颁发机构的证书。如果您有注册域名,Let's Encrypt 会提供受到广泛信任的免费证书。
使用来自公认 CA 的证书时,请确保 CA 的根证书和中间证书是服务器和客户端上操作系统信任存储的一部分。
在使用受信任证书的生产部署中,使用以下代码配置MongoDB 服务器设置:
net: tls: mode: requireTLS certificateKeyFile: /etc/ssl/mongodb.pem # Your trusted certificate with private key
在前面的配置中,mongodb.pem
包含由受信任 CA 签署的服务器证书及其私钥。由于该 CA 已受到操作系统信任,因此您无需指定 CAFile
参数。
有关使用受信任证书配置MongoDB 的更多详细信息,请参阅在自托管部署上为 TLS/SSL 配置mongod
和 。mongos