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

注意

如果禁用enforceUserClusterSeparation参数,则应用以下行为:

  • 如果配置文件中的clusterAuthModekeyFile ,则会禁用O/OU/DC检查。这允许拥有成员证书的客户端以$external数据库中存储的用户身份进行身份验证。

  • 如果配置文件中的clusterAuthMode不是keyFile ,则服务器不会启动。

如果将enforceUserClusterSeparation参数设置为false ,则服务器不区分应用程序用于进行身份验证的客户端证书和具有特权访问权限的集群内证书。如果您的clusterAuthModekeyFile ,则此操作无效。但是,如果clusterAuthModex509 ,则使用允许模式的用户证书将与集群证书合并并授予特权访问权限。

如果执行以下操作,您的现有证书将被授予内部特权:

  1. 使用此参数允许的名称创建一个用户。

  2. enforceUserClusterSeparation参数设置为false

  3. clusterAuthMode 设置为 x509

在未验证是否已删除具有enforceUserClusterSeparation标志允许您创建的提升权限的用户之前,不得从keyFile升级到x509

要将enforceUserClusterSeparation参数设置为false ,请在启动期间运行以下命令:

mongod --setParameter enforceUserClusterSeparation=false

证书具有以下要求:

  • 必须由一个证书颁发机构 (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 等。

注意

从版本 4.2 开始,MongoDB 提供与 net.ssl 设置(及其相应命令行选项)对应的 net.tls 设置(及其相应命令行选项)。由于 MongoDB 始终支持 TLS 1.0 及更高版本,因此 net.tls 设置可提供与 net.ssl 选项相同的功能。

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

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

注意

该过程使用net.tls设置(从 MongoDB 4 . 2开始可用)。有关使用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设置(从 MongoDB 4 . 2开始可用)。有关使用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设置(从 MongoDB 4 . 2开始可用)。有关使用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设置(从 MongoDB 4 . 2开始可用)。有关使用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设置(从 MongoDB 4 . 2开始可用)。有关使用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 4.2 开始,为避免指定明文密码,您可以在配置文件中使用扩展值

提示

另请参阅:

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

从 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 配置。

注意

从版本 4.2 开始,MongoDB 提供与 net.ssl 设置(及其相应命令行选项)对应的 net.tls 设置(及其相应命令行选项)。由于 MongoDB 始终支持 TLS 1.0 及更高版本,因此 net.tls 设置可提供与 net.ssl 选项相同的功能。

本部分中的过程使用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 / 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 而不是指定证书密钥文件。

设置
注意

设置为 requireSSL

此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您也可指定 allowSSLpreferSSL 来使用混合 TLS/SSL 模式。请参阅 net.ssl.mode 了解详情。

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

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

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

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

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

要防止已撤销证书的客户端连接到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文件中所列证书的客户端无法进行连接。

提示

另请参阅:

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

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

要为不出示证书的客户端绕过客户端证书验证,请将 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 配置

提示

另请参阅:

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

为防止 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 / mongos 的证书密钥文件已加密,请将 net.ssl.PEMKeyPassword 设置为密码。

提示

另请参阅:

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

注意

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

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

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

← TLS/SSL(传输加密)