为 TLS/SSL配置mongodmongos

概述

本文档帮助您配置新的 MongoDB 实例以支持 TLS/SSL。有关将当前不使用 TLS/SSL 的集群升级为使用 TLS/SSL 的说明,请参阅升级集群以改用 TLS/SSL

MongoDB 使用本机 TLS/SSL 操作系统库:

平台 TLS/SSL 库
视窗 安全通道 (Schannel)
操作系统/BSD 打开SSL
苹果系统 安全运输

[NOTE]

  • 从 4.0 版开始,MongoDB在 TLS 1.1+ 可用的系统上禁用对 TLS 1.0 加密的支持。有关详细信息,请参阅禁用 TLS 1.0 。
  • MongoDB 的 TLS/SSL 加密只允许对所有连接使用至少 128 位密钥长度的强 TLS/SSL 密码。
  • MongoDB的Linux 64 位传统 x64构建包括对 TLS/SSL 的支持。

先决条件

[IMPORTANT]

TLS/SSL、PKI(公钥基础设施)证书和证书颁发机构的完整描述超出了本文档的范围。此页面假定您事先了解 TLS/SSL 以及对有效证书的访问权限。

证书颁发机构

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

mongodmongos证书密钥文件

在建立 TLS/SSL 连接时, mongod/mongos向其客户端提供证书密钥文件以建立其身份。[ 1 ]证书密钥文件包含一个公钥证书及其关联的私钥,但只有公共部分会显示给客户端。

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

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

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

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

程序(使用net.tls设置)

[NOTE]

从 4.2 版本开始,MongoDB 提供了net.tls与设置(及其相应的命令行选项)相对应的 net.ssl设置(和相应的命令行选项)。这些net.tls设置提供与选项相同的功能,net.ssl因为 MongoDB 一直支持 TLS 1.0 及更高版本。

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

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

以下部分将 mongod/配置mongos为使用 TLS/SSL 连接。通过这些 TLS/SSL 设置, mongod/mongos将其证书密钥文件呈现给客户端。但是, mongod/mongos不需要来自客户端的证书密钥文件来验证客户端的身份。要要求客户端的证书密钥文件,请参阅 设置mongodmongos使用客户端证书验证替代。

[NOTE]

该过程使用net.tls设置(从 MongoDB 4.2 开始可用)。有关使用net.ssl设置的步骤,请参阅 程序(使用net.ssl设置)。

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

PEM 密钥文件 (Linux/Windows/macOS)

环境 笔记
net.tls.mode 设置为requireTLS。此设置限制每个服务器仅使用 TLS/SSL 加密连接。您还可以指定值allowTLSpreferTLS设置在端口上使用混合 TLS/SSL 模式。详情请见 net.tls.mode
net.tls.certificateKeyFile 设置为包含 TLS/SSL 证书和密钥的文件的路径。mongod/mongos 实例将此文件呈现给其客户端以建立实例的身份。

系统 SSL 证书存储(Windows/macOS)

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

环境 笔记
net.tls.mode 设置为requireTLS。此设置限制每个服务器仅使用 TLS/SSL 加密连接。您还可以指定值allowTLSpreferTLS设置在端口上使用混合 TLS/SSL 模式。详情请见 net.tls.mode
net.tls.certificateSelector 设置为属性(subjectthumbprint)和值。此设置用于选择证书。详情请见 net.tls.certificateSelector

例如,考虑实例的以下配置文件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

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

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

也就是说,客户端必须指定 TLS/SSL 连接。有关使用 TLS/SSL 连接的更多信息,请参阅 使用加密连接到 MongoDB 实例(tls选项)

[TIP]

也可以看看:

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

设置mongodmongos使用客户端证书验证

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

  • mongod/mongos将其证书密钥文件提交给客户端进行验证。
  • mongod/mongos需要来自客户端的证书密钥文件来验证客户端的身份。

[NOTE]

该过程使用net.tls设置(从 MongoDB 4.2 开始可用)。有关使用net.ssl设置的步骤,请参阅 程序(使用net.ssl设置)。

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

[NOTE]

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

环境 笔记
net.tls.mode 设置为requireTLS。此设置限制每个服务器仅使用 TLS/SSL 加密连接。您还可以指定值allowTLSpreferTLS设置在端口上使用混合 TLS/SSL 模式。详情请见 net.tls.mode
net.tls.certificateKeyFile 设置为包含 TLS/SSL 证书和密钥的文件的路径。mongod/mongos 实例将此文件呈现给其客户端以建立实例的身份。
net.tls.CAFile 设置为包含用于验证客户端证书的证书链的文件的路径。mongod/mongos实例使用此文件来验证其客户端提供的证书。证书链包括根证书颁发机构的证书。

例如,考虑实例的以下配置文件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 实例(tls选项)

[TIP]

也可以看看:

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

为客户端阻止已撤销的证书

[NOTE]

该过程使用net.tls设置(从 MongoDB 4.2 开始可用)。有关使用net.ssl设置的步骤,请参阅 程序(使用net.ssl设置)。

为了防止证书被吊销的客户端连接到 mongodormongos实例,您可以使用:

    • 在线证书状态协议 (OCSP)

      从 4.4 版开始,为了检查证书吊销,MongoDBenables默认使用 OCSP(在线证书状态协议)作为指定 CRL 文件或使用system SSL certificate store.在 4.0 和 4.2 版本中,只能通过system certificate store在 Windows 或 macOS 上使用 OCSP 来使用。

    • 证书撤销列表 (CRL)

      要指定 CRL 文件,请将 include 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` 中列出的证书的客户端将无法连接。

>[TIP]
>
>也可以看看:您还可以使用命令行选项配置已撤销的证书列表。
>
>- 对于[`mongod`](https://www.mongodb.com/docs/manual/reference/program/mongod/#mongodb-binary-bin.mongod),见[`--tlsCRLFile`。](https://www.mongodb.com/docs/manual/reference/program/mongod/#std-option-mongod.--tlsCRLFile)
>- 对于[`mongos`](https://www.mongodb.com/docs/manual/reference/program/mongos/#mongodb-binary-bin.mongos),见[`--tlsCRLFile`。](https://www.mongodb.com/docs/manual/reference/program/mongos/#std-option-mongos.--tlsCRLFile)

仅在客户端出示证书时验证

在大多数情况下,确保客户端出示有效证书很重要。但是,如果您的客户端无法提供客户端证书或正在过渡到使用证书,您可能只想验证来自提供证书的客户端的证书。

[NOTE]

该过程使用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

A mongod/mongos使用这些设置运行允许连接来自:

  • 不提供证书的客户端。
  • 提供有效证书的客户端。

[NOTE]

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

所有连接,包括那些没有提供证书的连接,都使用 TLS/SSL 加密。

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

[TIP]

也可以看看:

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

禁止协议[img](https://www.mongodb.com/docs/manual/tutorial/configure-ssl/#disallow-protocols)

[NOTE]

该过程使用net.tls设置(从 MongoDB 4.2 开始可用)。有关使用net.ssl设置的步骤,请参阅 程序(使用net.ssl设置)。

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

例如,以下配置阻止 mongod/mongos接受使用TLS1_0或的传入连接TLS1_1

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

[TIP]

也可以看看:

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

TLS/SSL 证书密码

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

[TIP]

从 MongoDB 4.2 开始,为避免以明文形式指定密码,您可以在配置文件中使用扩展值。

[TIP]

也可以看看:

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

在线证书轮换img

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

要轮换这些证书中的一个或多个:

  1. 替换您希望在文件系统上轮换的一个或多个证书,注意以下限制:
    • 每个新证书必须与其要替换的证书具有相同的文件名相同的文件路径。
    • 如果轮换加密TLS Certificate,其密码必须与旧证书的密码相同(如 certificateKeyFilePassword配置文件设置所指定)。证书轮换不支持交互式密码提示。
  2. 连接mongosh到您希望对其执行证书轮换的实例mongodmongos
  3. 运行rotateCertificates命令或 shell db.rotateCertificates()方法以轮换实例使用的证书。mongodmongos

当发生证书轮换时:

  • mongod与或 实例的现有连接mongos不会终止,并将继续使用旧证书。
  • 任何新连接都将使用新证书。

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

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

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

在 FIPS 模式下运行

FIPS 兼容的 TLS/SSL 仅在MongoDB 企业版. 有关详细信息,请参阅 为 FIPS 配置 MongoDB 。

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

下一步

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

[TIP]

也可以看看:

使用 x.509 证书对客户端进行身份验证

程序(使用net.ssl设置)

[NOTE]

从 4.2 版本开始,MongoDB 提供了net.tls与设置(及其相应的命令行选项)相对应的 net.ssl设置(和相应的命令行选项)。这些net.tls设置提供与选项相同的功能,net.ssl因为 MongoDB 一直支持 TLS 1.0 及更高版本。

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

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

以下部分将 mongod/配置mongos为使用 TLS/SSL 连接。通过这些 TLS/SSL 设置, mongod/mongos将其证书密钥文件呈现给客户端。但是, mongod/mongos不需要来自客户端的证书密钥文件来验证客户端的身份。要要求客户端的证书密钥文件,请参阅 设置mongodmongos使用客户端证书验证反而。

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

PEM 密钥文件 (Linux/Windows/macOS)

环境 笔记
net.ssl.mode 设置为requireSSL。此设置限制每个服务器仅使用 TLS/SSL 加密连接。您还可以指定allowSSLpreferSSL 使用混合 TLS/SSL 模式。详情请见 net.ssl.mode
net.ssl.PEMKeyFile 设置为.pem包含 TLS/SSL 证书和密钥的文件。mongod/mongos实例将此文件呈现给其客户端以建立实例的身份。如果密钥已加密,请指定密码 ( net.ssl.PEMKeyPassword)。

系统 SSL 证书存储(Windows/macOS)

从 MongoDB 4.0 开始,您可以为 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
      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

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

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

也就是说,客户端必须指定 TLS/SSL 连接。有关使用 TLS/SSL 连接的更多信息,请参阅 使用加密连接到 MongoDB 实例(--ssl选项)

[TIP]

也可以看看:

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

设置mongodmongos使用客户端证书验证

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

  • mongod/mongos将其证书密钥文件提交给客户端进行验证。
  • mongod/mongos需要来自客户端的证书密钥文件来验证客户端的身份。

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

[NOTE]

从 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 设置为.pem包含 TLS/SSL 证书和密钥的文件。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 实例(ssl选项)

[TIP]

也可以看看:

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

为客户端阻止已撤销的证书

为了防止证书被吊销的客户端连接到 mongodormongos实例,您可以使用:

    • 在线证书状态协议 (OCSP)

      从 4.4 版开始,为了检查证书吊销,MongoDBenables默认使用 OCSP(在线证书状态协议)作为指定 CRL 文件或使用system SSL certificate store.在 4.0 和 4.2 版本中,只能通过system certificate store在 Windows 或 macOS 上使用 OCSP 来使用。

    • 证书撤销列表 (CRL)

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

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

      出示 /etc/ssl/revokedCertificates.pem 中列出的证书的客户端将无法连接。

      [TIP]

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

仅在客户端出示证书时验证

在大多数情况下,确保客户端出示有效证书很重要。但是,如果您的客户端无法提供客户端证书或正在过渡到使用证书,您可能只想验证来自提供证书的客户端的证书。

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

例如:

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

A mongod/mongos使用这些设置运行允许连接来自:

  • 不提供证书的客户端。
  • 提供有效证书的客户端。

[NOTE]

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

所有连接,包括那些没有提供证书的连接,都使用 TLS/SSL 加密。

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

[TIP]

也可以看看:

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

禁止协议img

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

例如,以下配置阻止 mongod/mongos接受使用TLS1_0或的传入连接TLS1_1

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

[TIP]

也可以看看:

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

TLS/SSL 证书密码

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

[TIP]

也可以看看:

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

在 FIPS 模式下运行

[NOTE]

FIPS 兼容的 TLS/SSL 仅在MongoDB 企业版. 有关详细信息,请参阅 为 FIPS 配置 MongoDB 。

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

下一步

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

[TIP]

也可以看看:

使用 x.509 证书对客户端进行身份验证

参见

原文 - Configure mongod and mongos for TLS/SSL

译者:景圣

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""