文档菜单
文档首页
/
MongoDB 手册
/ / /

配置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 操作系统库

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

注意

  • MongoDB在 TLS 1.1+ 可用的系统上禁用了 TLS 1.0 加密支持。

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

  • 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 检查。

  • 如果您的配置文件中的 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)。然而,根据 RFC2818,这种 CN 的使用已被弃用。RFC2818

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

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

    extendedKeyUsage = clientAuth

在建立 TLS/SSL 连接时,mongod / mongos 向其客户端提供一个证书密钥文件以建立其身份。[1] 证书密钥文件包含一个公钥证书及其相关私钥,但仅向客户端揭示公钥组件。

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

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

关于副本集和分片集群成员的证书,建议在不同服务器上使用不同的证书。这可以最小化私钥的暴露,并允许进行主机名验证。

注意

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

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

注意

MongoDB提供了与net.ssl设置(和--ssl命令行选项)相对应的net.tls设置(和--tls命令行选项)。由于MongoDB始终支持TLS 1.0和更高版本,新的tls设置与ssl设置提供相同的功能。

本节中的程序使用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 实例的 configuration file 中包含以下 TLS/SSL 设置

设置
说明

设置为 requireTLS

此设置限制每个服务器只能使用 TLS/SSL 加密连接。您也可以指定 allowTLSpreferTLS 的值,在端口上设置混合 TLS/SSL 模式。有关详细信息,请参阅net.tls.mode

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

mongod / mongos 实例向其客户端展示此文件以建立实例的身份。

例如,以下是一个 mongod 实例的配置文件示例

net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.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

您可以使用 Windows 和 macOS 的系统 SSL 证书存储。若要使用系统 SSL 证书存储,请指定 net.tls.certificateSelector 而不是指定证书密钥文件。

设置
说明

设置为 requireTLS

此设置限制每个服务器只能使用 TLS/SSL 加密连接。您也可以指定 allowTLSpreferTLS 的值,在端口上设置混合 TLS/SSL 模式。有关详细信息,请参阅net.tls.mode

设置为属性(可以是 subjectthumbprint)和值。

此设置用于选择证书。有关详细信息,请参阅net.tls.certificateSelector

例如,以下是一个 mongod 实例的配置文件示例

net:
tls:
mode: requireTLS
certificateSelector: subject="<CertificateCommonName>"
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 连接的更多信息,请参阅使用加密连接到 MongoDB 实例

提示

另请参阅

您还可以通过命令行选项而不是配置文件来配置 mongodmongos

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

  • mongod / mongos 向客户端展示其证书密钥文件以供验证。

  • mongod / mongos 需要客户端的证书密钥文件以验证客户端的身份。

注意

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

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

注意

您可以使用Windows和macOS的系统SSL证书存储。要使用系统SSL证书存储,请指定 net.ssl.certificateSelector 而不是指定证书密钥文件。

设置
说明

设置为 requireTLS

此设置限制每个服务器只能使用 TLS/SSL 加密连接。您也可以指定 allowTLSpreferTLS 的值,在端口上设置混合 TLS/SSL 模式。有关详细信息,请参阅net.tls.mode

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

mongod / mongos 实例向其客户端展示此文件以建立实例的身份。

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

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

重要

当使用TLS/SSL启用启动 mongod 实例时,您必须指定 --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证书,则其密码必须与旧证书的密码相同(如配置文件中的certificateKeyFilePassword设置所指定)。证书轮换不支持交互式密码提示。

  2. 连接到mongosh,对您要执行证书轮换的mongodmongos实例。

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

当进行证书轮换时

  • 现有连接到 mongodmongos 实例尚未终止,将继续使用旧证书。

  • 任何新的连接将使用新证书。

证书文件不正确、已过期、已被吊销或丢失将导致证书轮换失败,但不会使现有的 TLS 配置无效或终止正在运行的 mongodmongos 进程。

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

有关更多信息和使用说明,请参阅 rotateCertificatesdb.rotateCertificates()

注意

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

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

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

注意

MongoDB提供了与net.ssl设置(和--ssl命令行选项)相对应的net.tls设置(和--tls命令行选项)。由于MongoDB始终支持TLS 1.0和更高版本,新的tls设置与ssl设置提供相同的功能。

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

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

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

设置
说明
net.ssl.mode

设置为 requireSSL

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

net.ssl.PEMKeyFile

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

mongod / mongos 实例向其客户端展示此文件以建立实例的身份。

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

例如,以下是一个 mongod 实例的配置文件示例

net:
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.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

您可以使用Windows和macOS的系统SSL证书存储。要使用系统SSL证书存储,请指定 net.ssl.certificateSelector 而不是指定证书密钥文件。

设置
说明
net.ssl.mode

设置为 requireSSL

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

net.ssl.certificateSelector

设置为属性(可以是 subjectthumbprint)和值。

此设置用于选择证书。有关详细信息,请参阅 net.ssl.certificateSelector

例如,以下是一个 mongod 实例的配置文件示例

net:
ssl:
mode: requireSSL
certificateSelector: subject="<CertificateCommonName>"
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 连接的更多信息,请参阅使用加密连接到 MongoDB 实例

提示

另请参阅

您还可以通过命令行选项而不是配置文件来配置 mongodmongos

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

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

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

  • mongod / mongos 向客户端展示其证书密钥文件以供验证。

  • mongod / mongos 需要客户端的证书密钥文件以验证客户端的身份。

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

注意

您可以使用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