为 TLS/SSL 配置 mongod 和 mongos

在本页面

概观

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

注意 TLS 是 SSL 的后续产品。

这些说明假定您已经安装了包含 TLS/SSL 支持的 MongoDB 的 build,并且您的 client 驱动程序支持加密连接。有关将当前未使用 TLS/SSL 的 cluster 升级为使用 TLS/SSL 的说明,请参阅升级 Cluster 以使用 TLS/SSL

MongoDB 的 TLS/SSL 加密仅允许使用强 TLS/SSL 密码,所有连接的长度均为 128-bit key。

先决条件

重要 TLS/SSL,PKI(公共 Key 基础结构)证书和证书 Authority 的完整描述超出了本文档的范围。本页假定 TLS/SSL 的先验知识以及对有效证书的访问。

注意 MongoDB 的 Linux 64-bit legacy x64 版本**不包括对 TLS/SSL 的支持。

Client 支持

请参阅TLS/SSL _Conients 配置 Clients以了解 Python,Java,Ruby 和其他 clients 的 TLS/SSL 支持。

证书 Authorities

对于 production use,MongoDB 部署应使用由单个证书 authority 生成和签名的有效证书。您或您的组织可以生成和维护独立证书 authority,或使用 third-party TLS/SSL 供应商生成的证书。获取和管理证书超出了本文档的范围。

.pem 档案

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

MongoDB 可以使用由证书 authority 或 self-signed 证书颁发的任何有效 TLS/SSL 证书。如果使用 self-signed 证书,虽然通信 channel 将被加密,但不会验证服务器身份。虽然这种情况可以防止对连接的窃听,但是它会让你容易受到攻击。使用由受信任证书签署的证书 authority 将允许 MongoDB 驱动程序验证服务器的身份。

通常,除非网络受信任,否则请避免使用 self-signed 证书。

另外,关于副本 set/sharded cluster 成员之间的身份验证,为了最大限度地减少私有 key 的暴露并允许主机名验证,建议在不同的服务器上使用不同的证书。

出于测试目的,您可以在 Unix 系统上使用类似于以下内容的命令生成 self-signed 证书和私有 key:

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

此操作将生成一个新的 self-signed 证书,其中没有密码短语,该密码短语有效期为 365 天。获得证书后,将证书和 private key 连接到.pem文件,如下面的示例所示:

cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

也可以看看 使用 x.509 证书对 Clients 进行身份验证

[1]对于 FIPS 模式,请确保证书是 FIPS-compliant(i.e 使用 FIPS-compliant 算法)并且 private key 符合 PKCS#8 标准。如果需要将私有 key 转换为 PKCS#8 格式,则存在各种转换工具,例如openssl pkcs8和其他。

程序

注意 从 MongoDB 3.6 开始,mongodmongos默认绑定到 localhost。如果部署成员在不同主机上运行,或者您希望 remote clients 连接到部署,则必须指定--bind_ipnet.bindIp。有关更多信息,请参阅Localhost Binding 兼容性更改

使用 TLS/SSL Certificate 和 Key 设置 mongod 和 mongos

要在 MongoDB 部署中使用 TLS/SSL,请在mongodmongos中包含以下 run-time 选项:

  • net.ssl.mode设置为requireSSL。此设置限制每个服务器仅使用 TLS/SSL 加密连接。您还可以指定 value allowSSLpreferSSL以在 port 上设置混合 TLS/SSL 模式的使用。有关详细信息,请参阅net.ssl.mode

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

请考虑mongod的以下语法:

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

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

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

注意

  • 使用证书的完整路径 name 指定<pem>

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

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

如果使用YAML configuration 文件格式,请在文件中包含以下 configuration:

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

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

也可以看看 升级 Cluster 以使用 TLS/SSL

使用证书验证设置 mongod 和 mongos

要使用由证书 authority 签名的 TLS/SSL 证书为 TLS/SSL 加密设置mongodmongos,请在启动期间包括以下 run-time 选项:

  • net.ssl.mode设置为requireSSL。此设置限制每个服务器仅使用 TLS/SSL 加密连接。您还可以指定 value allowSSLpreferSSL以在 port 上设置混合 TLS/SSL 模式的使用。有关详细信息,请参阅net.ssl.mode

  • PEMKeyfile包含.pem文件的 name,其中包含签名的 TLS/SSL 证书和 key。

  • 凭证档案错误包含.pem文件的 name,该文件包含 Certificate Authority 中的根证书链。

请考虑mongod的以下语法:

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

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

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

注意

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

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

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

如果使用YAML configuration 文件格式,请在文件中包含以下 configuration:

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

要使用 TLS/SSL 连接到mongodmongos实例,mongo工具必须包含--ssl--sslPEMKeyFile选项。有关连接mongodmongos running 与 TLS/SSL 的更多信息,请参见TLS/SSL _Conients 配置 Clients

也可以看看 升级 Cluster 以使用 TLS/SSL

阻止 Clients 的吊销证书

要防止具有来自 connecting 的已吊销证书的 clients,请包含sslCRLFile以指定包含已吊销证书的.pem文件。

对于 example,以下mongod with TLS/SSL configuration 包含sslCRLFile设置:

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

中具有已撤销证书的客户端将无法连接到此mongod实例。

仅在 Client 提供证书时验证

在大多数情况下,确保 clients 提供有效证书非常重要。但是,如果您有 clients 无法提供 client 证书,或者正在转换为使用证书 authority,您可能只想验证来自提供证书的 clients 的证书。

如果要绕过不提供证书的 clients 的验证,请在mongodmongos中包含allowConnectionsWithoutCertificates run-time 选项。如果 client 未提供证书,则不会进行验证。这些连接虽然未经过验证,仍然使用 TLS/SSL 进行加密。

对于 example,请考虑以下带有包含allowConnectionsWithoutCertificates设置的 TLS/SSL configuration 的mongod

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

然后,clients 可以使用选项--sslno证书连接,也可以使用选项--ssl有效证书连接。有关 clients 的 TLS/SSL 连接的更多信息,请参阅TLS/SSL _Conients 配置 Clients

注意 如果 client 提供证书,则证书必须是有效证书。 所有连接(包括未提供证书的连接)都使用 TLS/SSL 加密。

禁止协议

version 3.0.7 中的新内容。

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

例如,以下 configuration 使用--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 configuration 文件格式

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 files 可以加密。使用加密的 PEM files,您必须在启动时使用 command-line 或 configuration 文件选项指定密码,或在出现提示时输入密码。

要在命令 line 或 configuration 文件中以明文形式指定密码,请使用PEMKeyPassword and/or clusterPassword选项。

要在mongodmongos开头为 MongoDB 提示密码,并避免以明文形式指定密码,请省略PEMKeyPassword and/or clusterPassword选项。 MongoDB 将根据需要提示每个密码。

重要 如果使用连接的终端在前台运行 MongoDB 实例,则可以使用密码提示选项。如果您在 non-interactive session 中运行mongodmongos(e.g. 没有终端或 Windows 上的服务),则无法使用密码短语提示选项。

在 FIPS 模式下运行

注意 FIPS-compatible TLS/SSL 仅在MongoDB 企业版中可用。有关更多信息,请参见为 FIPS 配置 MongoDB

有关详细信息,请参阅为 FIPS 配置 MongoDB