Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

为 TLS/SSL 配置 mongodmongos

在此页面上

  • Overview
  • 先决条件
  • 证书颁发机构
  • 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.1+ 的系统上禁用对 TLS 1.0 加密的支持。

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

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

重要

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

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

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

MongoDB 可以使用自签名证书或证书颁发机构颁发的任何有效 TLS 证书。如果您使用自签名证书,尽管会加密通信通道以防止窃听连接,但不会验证服务器身份。这使您容易遭受中间人攻击。使用由可信证书颁发机构签名的证书允许 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 实例的配置文件中包含以下 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>

请参阅使用加密连接到 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 设置:

注意

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

设置
注意

设置为 requireTLS

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

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

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

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

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

重要

在启动启用了 TLS/SSLmongod 实例时,您必须指定 --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()

注意

只有 MongoDB Enterprise 支持与 FIPS 兼容的 TLS/SSL。有关更多信息,请参阅为 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 连接,请在 mongod / mongos 实例的配置文件中包含以下 TLS/SSL 设置:

设置
注意
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>

请参阅使用加密连接到 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 设置:

注意

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

注意

只有 MongoDB Enterprise 支持与 FIPS 兼容的 TLS/SSL。有关更多信息,请参阅为 FIPS 配置 MongoDB

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

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

后退

TLS/SSL