Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

mongodmongos TLS/SSL 配置 和

在此页面上

  • 概述
  • 先决条件
  • 证书颁发机构
  • mongodmongos 证书密钥文件
  • 过程(使用 net.tls 设置)
  • 使用 TLS/SSL 证书和密钥设置 mongodmongos
  • 使用客户端证书验证设置 mongodmongos
  • 禁用协议
  • TLS/SSL 证书密码。
  • 在线证书轮换
  • 在 FIPS 模式下运行
  • 后续步骤
  • 过程(使用 net.ssl 设置)
  • 使用 TLS/SSL 证书和密钥设置 mongodmongos
  • 使用客户端证书验证设置 mongodmongos
  • 禁用协议
  • TLS/SSL 证书密码。
  • 在 FIPS 模式下运行
  • 后续步骤

本文档帮助您配置新的 MongoDB 实例来支持 TLS/SSL。请参阅升级集群以使用 TLS/SSL,了解如何将当前不使用 TLS/SSL 的集群升级为使用 TLS/SSL 的集群。

MongoDB 使用原生 TLS / SSL OS 库:

平台
TLS/SSL 库
Windows
安全通道 (Schannel)
Linux/BSD
OpenSSL
macOS
安全传输

注意

  • MongoDB 禁用对 TLS 1的支持。在使用 TLS 1的系统上进行0加密。 1 + 可用。

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

  • MongoDB 的 Linux 64 位旧版 x64 构建包括对 TLS/SSL 的支持。

重要

TLS/SSL、PKI(公钥基础设施)证书和证书颁发机构的完整描述已超出本文档的范围。本页假设您已了解 TLS/SSL 并可访问有效证书。

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

使用成员证书来验证分片集群或副本集的成员资格。成员证书文件路径用 net.tls.clusterFilenet.tls.certificateKeyFile 选项配置。成员具有以下配置要求:

  • 集群成员配置必须为至少一个用于身份验证的属性指定非空值。默认情况下,MongoDB 接受:

    • 组织 (O)

    • 组织单位 (OU)

    • 域组件 (DC)

    您可以通过设置 net.tls.clusterAuthX509.extensionValue 来指定用于身份验证的替代属性。

  • 集群成员配置必须包含相同的 net.tls.clusterAuthX509.attributes 并使用匹配值。属性顺序不重要。以下示例设置 OOU,但不设置 DC

    net:
    tls:
    clusterAuthX509:
    attributes: O=MongoDB, OU=MongoDB Server

证书具有以下要求:

  • 必须由一个证书颁发机构 (CA) 同时向分片集群或副本集成员颁发所有 x.509 证书。

  • 至少一个主题备用名称 (SAN) 条目必须与其他集群成员使用的服务器主机名匹配。比较 SAN时,MongoDB 可以比较 DNS 名称或 IP 地址。

    如果您不指定subjectAltName ,MongoDB 会改为比较公用名 (CN)。但是,根据 RFC ,CN 的这种用法已被弃用2818

  • 如果用作 certificateKeyFile 的证书包含 extendedKeyUsage,则该值必须同时包含 clientAuth(“TLS Web 客户端身份验证”)和 serverAuth(“TLS Web 服务器身份验证”)。

    extendedKeyUsage = clientAuth, serverAuth
  • 如果用作 clusterFile 的证书包含 extendedKeyUsage,则该值必须包含 clientAuth

    extendedKeyUsage = clientAuth

在建立 TLS/SSL 连接时,mongod / mongos 会向其客户端提交证书密钥文件,以确定其身份。[1] 证书密钥文件包含公钥证书及其关联的私钥,但仅向客户端透露公钥部分。

MongoDB 可以使用自签名证书或证书颁发机构颁发的任何有效 TLS 证书。如果您使用自签名证书,尽管会加密通信通道以防止窃听连接,但不会验证服务器身份。这使您容易遭受中间人攻击。使用由可信证书颁发机构签名的证书允许 MongoDB 驱动程序验证服务器的身份。

一般来说,除非网络可信赖,否则应避免使用自签名证书。

对于副本集和分片集群成员的证书,建议在不同服务器上使用不同证书。此举可最大程度地减少私钥的暴露,并允许进行主机名验证。

注意

如果 MongoDB 部署未配置为使用 CA 文件,则将绕过客户端证书验证。

[1] 对于 FIPS 模式,请确保证书符合 FIPS 标准(即使用符合 FIPS 标准的算法),且私钥符合 PKCS#8 标准。如果您需要将私钥转换为 PKCS#8 格式,可以使用多种转换工具,例如 openssl pkcs8 等。

注意

MongoDB 提供与net.tls --tlsnet.ssl设置(和--ssl 命令行选项)相对应的 设置(和 命令行选项)。新的tls 设置提供与 设置 相同 的功能,因为ssl MongoDB 始终支持 TLS1 。0 及更高版本。

本部分中的过程使用net.tls设置。有关使用net.ssl别名的过程,请参阅过程(使用net.ssl设置)。

以下部分将配置mongod / mongos以使用 TLS/SSL 连接。使用这些 TLS/SSL 设置, mongod / mongos会将其证书密钥文件提供给客户端。但是, mongod / mongos不需要客户端提供证书密钥文件来验证客户端的身份。如需客户端证书密钥文件,请参阅使用客户端证书验证设置mongodmongos

注意

该过程使用net.tls设置。有关使用net.ssl设置的过程,请参阅过程(使用net.ssl设置)。

要使用 TLS/SSL 连接,请在 mongod / mongos 实例的配置文件中包含以下 TLS/SSL 设置

使用上述配置的mongod实例只能接受 TLS/SSL 连接:

mongod --config <path/to/configuration/file>

请参阅使用加密连接到 MongoDB 实例,了解通过 TLS/SSL 连接的更多信息。

提示

另请参阅:

您也可以使用命令行选项而不是配置文件来配置 mongodmongos

以下部分将配置 mongod / mongos 以使用 TLS/SSL 连接并执行客户端证书验证。通过这些 TLS/SSL 设置:

  • mongod / mongos 向客户端提交证书密钥文件以供验证。

  • mongod / mongos 要求客户端提供证书密钥文件,以验证客户端身份。

注意

该过程使用net.tls设置。有关使用net.ssl设置的过程,请参阅过程(使用net.ssl设置)。

要使用 TLS/SSL 连接并执行客户端证书验证,请在 mongod / mongos 实例的配置文件中包含以下 TLS/SSL 设置:

注意

从 MongoDB 4开始。 0 ,您可以使用适用于 Windows 和 macOS 的系统 SSL 证书存储区。要使用系统 SSL 证书存储区,请指定net.ssl.certificateSelector而不是指定证书密钥文件。

设置
注意

设置为 requireTLS

此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您还可指定 allowTLSpreferTLS 值,从而设置在端口上使用混合 TLS/SSL 模式。请参阅 net.tls.mode 了解详情。

设为包含 TLS/SSL 证书和密钥的文件的路径。

mongod / mongos 实例会向其客户端提供此文件以确定该实例的身份。

设为包含证书链(用于验证客户端证书)的文件的路径。

mongod / mongos 实例使用此文件来验证其客户端提供的证书。证书链包括根证书颁发机构的证书。

重要

启动mongod 启用了 TLS/SSL 的 实例时,您必须指定--tlsCAFile 标志、net.tls.CAFile 配置选项或tlsUseSystemCA 参数的值。

--tlsCAFiletls.CAFiletlsUseSystemCA 是互斥的。

例如,请考虑为 mongod 实例使用以下配置文件

net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/caToValidateClientCertificates.pem
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
storage:
dbPath: "/var/lib/mongodb"
processManagement:
fork: true
net:
bindIp: localhost,mongodb0.example.net
port: 27017

使用上述配置的mongod实例只能接受 TLS/SSL 连接,并要求其客户端提供有效证书:

mongod --config <path/to/configuration/file>

客户端必须指定 TLS/SSL 连接并向实例提供其证书密钥文件。 有关使用 TLS/SSL 连接的更多信息,请参阅连接到需要客户端证书的 MongoDB 实例

提示

另请参阅:

您也可以使用命令行选项而不是配置文件来配置 mongodmongos

注意

该过程使用net.tls设置。有关使用net.ssl设置的过程,请参阅过程(使用net.ssl设置)。

要防止已撤销证书的客户端连接到mongodmongos实例,您可以使用证书撤销列表 (CRL)。

要指定 CRL文件,请将net.tls.CRLFile设置为包含已撤销证书的文件。

例如:

net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/caToValidateClientCertificates.pem
CRLFile: /etc/ssl/revokedCertificates.pem

提供/etc/ssl/revokedCertificates.pem文件中所列证书的客户端无法进行连接。

提示

另请参阅:

您还可以使用命令行选项配置已撤销的证书列表。

在大多数情况下,必须确保客户端提供有效的证书。但是如果您的客户端无法提供客户端证书或正在转换为使用证书,您可能只想验证提供证书的客户端的证书。

注意

该过程使用net.tls设置。有关使用net.ssl设置的操作步骤,请参阅操作步骤(使用net.ssl设置)。

要为不出示证书的客户端绕过客户端证书验证,请将 net.tls.allowConnectionsWithoutCertificates 设置为 true

例如:

net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/caToValidateClientCertificates.pem
allowConnectionsWithoutCertificates: true

使用这些设置运行的 mongod / mongos 允许来自以下地址的连接:

  • 不出示证书的客户端。

  • 出示有效证书的客户端。

注意

如果客户端提供了证书,则该证书必须为有效证书。

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

有关客户端 TLS/SSL 连接的更多信息,请参阅客户端 TLS/SSL 配置

提示

另请参阅:

您也可以使用命令行选项进行配置:

注意

该过程使用net.tls设置。有关使用net.ssl设置的操作步骤,请参阅操作步骤(使用net.ssl设置)。

为防止 MongoDB 服务器接受使用特定协议的传入连接,请将 net.tls.disabledProtocols 设置为禁止使用的协议。

例如,以下配置可防止 mongod / mongos 接受使用 TLS1_0TLS1_1 的传入连接

net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/caToValidateClientCertificates.pem
disabledProtocols: TLS1_0,TLS1_1

提示

另请参阅:

您也可以使用命令行选项进行配置:

如果 mongod / mongos 的证书密钥文件已加密,请将 net.tls.certificateKeyFilePassword 设置为密码。

提示

为避免以明文形式指定密码,可以在配置文件中使用扩展值

提示

另请参阅:

您也可以使用命令行选项进行配置:

从 MongoDB 5.0 开始,您可按需轮换以下证书密钥文件:

轮换一个或多个证书:

  1. 替换您要在文件系统中轮换的证书,并注意以下限制:

    • 每个新证书的文件名文件路径必须与被替换的证书相同。

    • 如果轮换加密的 TLS Certificate,其密码必须与旧证书的密码相同(如 certificateKeyFilePassword 配置文件设置所指定)。证书轮换不支持交互式密码提示。

  2. mongosh连接到您希望执行证书轮换的mongodmongos实例。

  3. 运行 rotateCertificates 命令或 db.rotateCertificates() Shell 方法来轮换 mongodmongos 实例使用的证书。

当证书轮换发生时:

  • mongod}mongos 实例的现有连接不会终止,并将继续使用旧证书。

  • 所有新连接都将使用新证书。

证书文件错误、过期、撤销或丢失会导致证书轮换失败,但不会导致现有 TLS 配置失效或终止正在运行的 mongodmongos 进程。

在 MongoDB 5.0 之前,证书轮换需要停机,并且通常在维护窗口期间执行。

有关其他注意事项和完整的使用说明,请参阅 rotateCertificatesdb.rotateCertificates()

注意

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

请参阅为 FIPS 配置 MongoDB,了解详情。

如需为客户端配置 TLS/SSL 支持,请参阅客户端的 TLS/SSL 配置。

注意

MongoDB 提供与net.tls --tlsnet.ssl设置(和--ssl 命令行选项)相对应的 设置(和 命令行选项)。新的tls 设置提供与 设置 相同 的功能,因为ssl MongoDB 始终支持 TLS1 。0 及更高版本。

本部分中的过程使用net.ssl设置。有关使用net.tls别名的过程,请参阅过程(使用net.tls设置)。

以下部分将配置mongod / mongos以使用 TLS/SSL 连接。使用这些 TLS/SSL 设置, mongod / mongos会将其证书密钥文件提供给客户端。但是, mongod / mongos不需要客户端提供证书密钥文件来验证客户端的身份。如需客户端证书密钥文件,请参阅使用客户端证书验证设置mongodmongos

要使用 TLS/SSL 连接,请在 mongod / mongos 实例的配置文件中包含以下 TLS/SSL 设置:

使用上述配置的mongod实例只能接受 TLS/SSL 连接:

mongod --config <path/to/configuration/file>

请参阅使用加密连接到 MongoDB 实例,了解通过 TLS/SSL 连接的更多信息。

提示

另请参阅:

您也可以使用命令行选项而不是配置文件来配置 mongodmongos

  • 对于mongod ,请参阅--sslMode--sslPEMKeyFile--sslCertificateSelector

  • 对于mongos ,请参阅: --sslMode--sslPEMKeyFile--sslCertificateSelector

以下部分将配置 mongod / mongos 以使用 TLS/SSL 连接并执行客户端证书验证。通过这些 TLS/SSL 设置:

  • mongod / mongos 向客户端提交证书密钥文件以供验证。

  • mongod / mongos 要求客户端提供证书密钥文件,以验证客户端身份。

要使用 TLS/SSL 连接,请在 mongod / mongos 实例的配置文件中包含以下 TLS/SSL 设置:

注意

从 MongoDB 4开始。 0 ,您可以使用适用于 Windows 和 macOS 的系统 SSL 证书存储区。要使用系统 SSL 证书存储区,请指定net.ssl.certificateSelector而不是指定证书密钥文件。

设置
注意
net.ssl.mode

设置为 requireSSL

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

net.ssl.PEMKeyFile

设置为包含 TLS/SSL 证书和密钥的 .pem 文件。

mongod / mongos 实例会向其客户端提供此文件以确定该实例的身份。

如果密钥已加密,请指定密码 ( net.ssl.PEMKeyPassword )。

net.ssl.CAFile

设为包含证书链(用于验证客户端证书)的文件的路径。

mongod / mongos 实例使用此文件来验证其客户端提供的证书。证书链包括根证书颁发机构的证书。

例如,请考虑为 mongod 实例使用以下配置文件

net:
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/caToValidateClientCertificates.pem
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
storage:
dbPath: "/var/lib/mongodb"
processManagement:
fork: true
net:
bindIp: localhost,mongodb0.example.net
port: 27017

使用上述配置的mongod实例只能接受 TLS/SSL 连接,并要求其客户端提供有效证书:

mongod --config <path/to/configuration/file>

客户端必须指定 TLS/SSL 连接并向实例提供其证书密钥文件。 有关使用 TLS/SSL 连接的更多信息,请参阅连接到需要客户端证书的 MongoDB 实例

提示

另请参阅:

您也可以使用命令行选项而不是配置文件来配置 mongodmongos

  • 对于mongod ,请参阅--sslMode--sslPEMKeyFile--sslCAFile

  • 对于mongos ,请参阅--sslMode--sslPEMKeyFile--sslCAFile

要防止已撤销证书的客户端连接到mongodmongos实例,您可以使用证书撤销列表 (CRL)。

要指定 CRL 文件,请将 net.ssl.CRLFile 设置为包含已撤销证书的文件。

例如:

net:
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/caToValidateClientCertificates.pem
CRLFile: /etc/ssl/revokedCertificates.pem

提供/etc/ssl/revokedCertificates.pem文件中所列证书的客户端无法进行连接。

提示

另请参阅:

您还可以使用命令行选项配置已撤销的证书列表。

  • 对于mongod ,请参阅--sslCRLFile

  • 对于mongos ,请参阅--sslCRLFile

在大多数情况下,必须确保客户端提供有效的证书。但是如果您的客户端无法提供客户端证书或正在转换为使用证书,您可能只想验证提供证书的客户端的证书。

要绕过不提供证书的客户端的客户端证书验证,请将net.ssl.allowConnectionsWithoutCertificates设置为true

例如:

net:
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/caToValidateClientCertificates.pem
allowConnectionsWithoutCertificates: true

使用这些设置运行的 mongod / mongos 允许来自以下地址的连接:

  • 不出示证书的客户端。

  • 出示有效证书的客户端。

注意

如果客户端提供了证书,则该证书必须为有效证书。

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

有关客户端 TLS/SSL 连接的更多信息,请参阅客户端 TLS/SSL 配置

提示

另请参阅:

您也可以使用命令行选项进行配置:

  • 对于mongod ,请参阅--sslAllowConnectionsWithoutCertificates

  • 对于mongos ,请参阅--sslAllowConnectionsWithoutCertificates

要防止 MongoDB 服务器接受使用特定协议的传入连接,请将net.ssl.disabledProtocols设置为不允许的协议。

例如,以下配置可防止 mongod / mongos 接受使用 TLS1_0TLS1_1 的传入连接

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

提示

另请参阅:

您也可以使用命令行选项进行配置:

  • 对于mongod ,请参阅--sslDisabledProtocols

  • 对于mongos ,请参阅--sslDisabledProtocols

如果mongod / mongos的证书密钥文件已加密,请包括设置为密码的net.ssl.PEMKeyPassword

提示

另请参阅:

您也可以使用命令行选项进行配置:

  • 对于mongod ,请参阅sslPEMKeyPassword

  • 对于mongos ,请参阅--sslPEMKeyPassword

注意

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

请参阅为 FIPS 配置 MongoDB,了解详情。

如需为客户端配置 TLS/SSL 支持,请参阅客户端的 TLS/SSL 配置。

← TLS/SSL(传输加密)