为 TLS/SSL 配置 mongod 和 mongos

在本页面

Overview

本文档可帮助您配置 MongoDB 以支持 TLS/SSL。 MongoDBClient 端可以使用 TLS/SSL 加密到mongodmongos实例的连接。 MongoDB TLS/SSL 实现使用 OpenSSL 库。

Note

TLS 是 SSL 的后继产品。

这些说明假定您已经安装了包含 TLS/SSL 支持的 MongoDB 构建,并且您的 Client 端驱动程序支持加密连接。有关将当前不使用 TLS/SSL 的群集升级到使用 TLS/SSL 的说明,请参阅升级群集以使用 TLS/SSL

MongoDB 的 TLS/SSL 加密仅允许对所有连接使用最小长度为 128 位密钥长度的强 TLS/SSL 密码。

Prerequisites

Important

TLS/SSL,PKI(公钥基础结构)证书和证书颁发机构的完整描述不在本文档的范围之内。该页面假定您具有 TLS/SSL 的先验知识以及对有效证书的访问权限。

Note

MongoDB 的* Linux 64 位旧版 x64 *版本不包括对 TLS/SSL 的支持。

Client Support

请参阅Client 端的 TLS/SSL 配置,以了解对 Python,Java,Ruby 和其他 Client 端的 TLS/SSL 支持。

Certificate Authorities

对于生产用途,您的 MongoDB 部署应使用由单个证书颁发机构生成和签名的有效证书。您或您的组织可以生成和维护独立的证书颁发机构,也可以使用第三方 TLS/SSL 供应商生成的证书。获取和 Management 证书超出了本文档的范围。

.pem File

在使用 TLS/SSL 之前,您必须具有一个.pem文件,其中包含公钥证书及其关联的私钥。 [1]

MongoDB 可以使用证书颁发机构颁发的任何有效 TLS/SSL 证书,也可以使用自签名证书。如果您使用自签名证书,则尽管通信通道将被加密,但服务器身份将没有验证。尽管这种情况可以防止窃听连接,但是您很容易受到中间人攻击。使用由受信任的证书颁发机构签名的证书,将允许 MongoDB 驱动程序验证服务器的身份。

通常,除非信任网络,否则请避免使用自签名证书。

另外,关于副本集/分片群集成员之间的身份验证,为了最大程度地减少私钥的暴露并允许主机名验证,建议在不同的服务器上使用不同的证书。

为了进行“测试”,您可以在 Unix 系统上使用类似于以下命令的命令生成自签名证书和私钥:

cd /etc/ssl/
openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key

此操作将生成一个新的自签名证书,该证书没有密码短语,有效期为 365 天。获得证书后,将证书和私钥连接到.pem文件,如以下示例所示:

cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
[1]对于 FIPS 模式,请确保证书符合 FIPS 标准(即使用 FIPS 兼容算法),并且私钥符合 PKCS#8 标准。如果需要将私钥转换为 PKCS#8 格式,则可以使用各种转换工具,例如openssl pkcs8等。

Procedures

Note

从 MongoDB 3.6 开始,默认情况下mongodmongos绑定到 localhost。如果部署的成员在不同的主机上运行,或者希望远程 Client 端连接到部署,则必须指定--bind_ipnet.bindIp。有关更多信息,请参见Localhost 绑定兼容性更改

使用 TLS/SSL 证书和密钥设置 mongod 和 mongos

要在您的 MongoDB 部署中使用 TLS/SSL,请在mongodmongos中包括以下运行时选项:

  • net.ssl.mode设置为requireSSL。此设置将每个服务器限制为仅使用 TLS/SSL 加密的连接。您也可以指定值allowSSLpreferSSL来设置在端口上使用混合 TLS/SSL 模式。有关详情,请参见net.ssl.mode

  • PEMKeyfile和包含 TLS/SSL 证书和密钥的.pem文件。

考虑mongod的以下语法:

mongod --sslMode requireSSL --sslPEMKeyFile <pem> <additional options>

例如,给定位于/etc/ssl/mongodb.pem的 TLS/SSL 证书,请使用以下命令将mongod配置为对所有连接使用 TLS/SSL 加密:

mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem <additional options>

Note

  • 指定<pem>以及证书的完整路径名。

  • 如果<pem>的私钥部分已加密,请指定密码。参见TLS/SSL 证书密码短语

您也可以在configuration file中指定这些选项,如以下示例所示:

如果使用YAML 配置文件格式,则在文件中包括以下配置:

net:
   ssl:
      mode: requireSSL
      PEMKeyFile: /etc/ssl/mongodb.pem

要使用 TLS/SSL 连接到mongodmongos实例,mongo shell 和 MongoDB 工具必须包含--ssl选项。有关连接到使用 TLS/SSL 运行的mongodmongos的更多信息,请参见Client 端的 TLS/SSL 配置

使用证书验证设置 mongod 和 mongos

要使用由证书颁发机构签名的 TLS/SSL 证书为 TLS/SSL 加密设置mongodmongos,请在启动过程中包括以下运行时选项:

  • net.ssl.mode设置为requireSSL。此设置将每个服务器限制为仅使用 TLS/SSL 加密的连接。您也可以指定值allowSSLpreferSSL来设置在端口上使用混合 TLS/SSL 模式。有关详情,请参见net.ssl.mode

  • PEMKeyfile,其名称为.pem文件的名称,其中包含已签名的 TLS/SSL 证书和密钥。

  • CAFile,其名称为.pem文件的名称,该文件包含来自证书颁发机构的根证书链。

考虑mongod的以下语法:

mongod --sslMode requireSSL --sslPEMKeyFile <pem> --sslCAFile <ca> <additional options>

例如,给定位于/etc/ssl/mongodb.pem处的已签名 TLS/SSL 证书和位于/etc/ssl/ca.pem处的证书颁发机构文件,可以为 TLS/SSL 加密配置mongod,如下所示:

mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem <additional options>

Note

  • 使用完整路径名或相对路径名指定<pem>文件和<ca>文件。

  • 如果<pem>已加密,请指定密码。参见TLS/SSL 证书密码短语

您也可以在configuration file中指定这些选项,如以下示例所示:

如果使用YAML 配置文件格式,则在文件中包括以下配置:

net:
   ssl:
      mode: requireSSL
      PEMKeyFile: /etc/ssl/mongodb.pem
      CAFile: /etc/ssl/ca.pem

要使用 TLS/SSL 连接到mongodmongos实例,mongo工具必须同时包含--ssl--sslPEMKeyFile选项。有关连接到使用 TLS/SSL 运行的mongodmongos的更多信息,请参见Client 端的 TLS/SSL 配置

阻止 Client 端的吊销证书

为了防止具有吊销证书的 Client 端连接,请包括sslCRLFile以指定包含吊销证书的.pem文件。

例如,以下具有 TLS/SSL 配置的mongod包括sslCRLFile设置:

mongod --sslMode requireSSL --sslCRLFile /etc/ssl/ca-crl.pem --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem <additional options>

/etc/ssl/ca-crl.pem中证书被吊销的 Client 端将无法连接到该mongod实例。

仅在 Client 出示证书时验证

在大多数情况下,确保 Client 端出示有效证书很重要。但是,如果您的 Client 端不能提供 Client 端证书,或者正在转换为使用证书颁发机构,则您可能只想从提供证书的 Client 端验证证书。

如果要绕过不提供证书的 Client 端的验证,请在mongodmongos中包括allowConnectionsWithoutCertificates运行时选项。如果 Client 端不提供证书,则不会进行验证。这些连接尽管未经验证,但仍使用 TLS/SSL 加密。

例如,请考虑以下带有allowConnectionsWithoutCertificates设置的 TLS/SSL 配置的mongod

mongod --sslMode requireSSL --sslAllowConnectionsWithoutCertificates --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem <additional options>

然后,Client 端可以使用选项--ssl 证书或通过选项--ssl有效 证书进行连接。有关 Client 端的 TLS/SSL 连接的更多信息,请参见Client 端的 TLS/SSL 配置

Note

如果 Client 端出示证书,则该证书必须是有效的证书。

所有连接(包括未提供证书的连接)均使用 TLS/SSL 加密。

Disallow Protocols

3.0.7 版中的新功能。

为防止 MongoDB 服务器接受使用特定协议的传入连接,请包含--sslDisabledProtocols选项,或者使用configuration filenet.ssl.disabledProtocols设置。

例如,以下配置使用--sslDisabledProtocols选项来防止mongod接受使用TLS1_0TLS1_1的传入连接:

mongod --sslMode requireSSL --sslDisabledProtocols TLS1_0,TLS1_1 --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem <additional options>

如果使用YAML 配置文件格式

net:
   ssl:
      mode: requireSSL
      PEMKeyFile: /etc/ssl/mongodb.pem
      CAFile: /etc/ssl/ca.pem
      disabledProtocols: TLS1_0,TLS1_1

有关更多信息,包括该选项可识别的协议,请参阅net.ssl.disabledProtocolsmongodmongos--sslDisabledProtocols选项。

TLS/SSL 证书密码

PEMKeyfileClusterFile的 PEM 文件可能已加密。对于加密的 PEM 文件,您必须在启动时使用命令行或配置文件选项指定密码短语,或在出现提示时 Importing 密码短语。

要在命令行或配置文件中以明文形式指定密码,请使用PEMKeyPassword和/或clusterPassword选项。

要让 MongoDB 在mongodmongos的开头提示 Importing 密码短语,并避免以明文形式指定密码短语,请省略PEMKeyPassword和/或clusterPassword选项。 MongoDB 将在必要时提示您 Importing 每个密码短语。

Important

如果您在连接了终端的情况下在前台运行 MongoDB 实例,则密码短语提示选项可用。如果您在非交互式会话中运行mongodmongos(例如,在没有终端或 Windows 上作为服务的情况下),则无法使用密码短语提示选项。

以 FIPS 模式运行

Note

兼容 FIPS 的 TLS/SSL 仅在MongoDB Enterprise中可用。有关更多信息,请参见为 FIPS 配置 MongoDB

有关更多详细信息,请参见为 FIPS 配置 MongoDB