为 TLS/SSL 配置 mongod
和 mongos
在此页面上
Overview
本文档帮助您配置新的 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 供应商生成的证书。获取和管理证书超出了本文档的范围。
mongod
和 mongos
证书密钥文件
在建立 TLS/SSL 连接时,mongod
/ mongos
会向其客户端提交证书密钥文件,以确定其身份。[1] 证书密钥文件包含公钥证书及其关联的私钥,但仅向客户端透露公钥部分。
MongoDB 可以使用自签名证书或证书颁发机构颁发的任何有效 TLS 证书。如果您使用自签名证书,尽管会加密通信通道以防止窃听连接,但不会验证服务器身份。这使您容易遭受中间人攻击。使用由可信证书颁发机构签名的证书允许 MongoDB 驱动程序验证服务器的身份。
一般来说,除非网络可信赖,否则应避免使用自签名证书。
对于副本集和分片集群成员的证书,建议在不同服务器上使用不同证书。此举可最大程度地减少私钥的暴露,并允许进行主机名验证。
注意
如果 MongoDB 部署未配置为使用 CA 文件,则将绕过客户端证书验证。
[1] | 对于 FIPS 模式,请确保证书符合 FIPS 标准(即使用符合 FIPS 标准的算法),且私钥符合 PKCS#8 标准。如果您需要将私钥转换为 PKCS#8 格式,可以使用多种转换工具,例如 openssl pkcs8 等。 |
过程(使用 net.tls
设置)
注意
MongoDB 提供与 net.ssl
设置(和 --ssl
命令行选项)相对应的 net.tls
设置(和 --tls
命令行选项)。由于 MongoDB 始终支持 TLS 1.0 及更高版本,因此新的 tls
设置可提供与 ssl
设置相同的功能。
本部分中的过程使用net.tls
设置。 有关使用net.ssl
别名的过程,请参阅过程(使用net.ssl
设置)。
使用 TLS/SSL 证书和密钥设置 mongod
和 mongos
以下部分将配置 mongod
/ mongos
以使用 TLS/SSL 连接。通过这些 TLS/SSL 设置,mongod
/ mongos
会将其证书密钥文件提供给客户端。但是,mongod
/ mongos
并不要求客户端提供证书密钥文件来验证客户端的身份。如要更改设置以要求客户端提供证书密钥文件,请参阅使用客户端证书验证设置 mongod
和 mongos
。
注意
操作过程使用 net.tls
设置。有关使用 net.ssl
设置的操作过程,请参阅操作过程(使用 net.ssl
设置)。
要使用 TLS/SSL 连接,请在 mongod
/ mongos
实例的配置文件中包含以下 TLS/SSL 设置:
设置 | 注意 |
---|---|
设置为 此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您还可指定 | |
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
而不是指定证书密钥文件。
设置 | 注意 |
---|---|
设置为 此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您还可指定 | |
设置为属性( 此设置用于选择证书。请参阅 |
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 连接的更多信息。
提示
另请参阅:
使用客户端证书验证设置 mongod
和 mongos
以下部分将配置 mongod
/ mongos
以使用 TLS/SSL 连接并执行客户端证书验证。通过这些 TLS/SSL 设置:
注意
操作过程使用 net.tls
设置 有关使用 net.ssl
设置的操作过程,请参阅操作过程(使用 net.ssl
设置)。
要使用 TLS/SSL 连接并执行客户端证书验证,请在 mongod
/ mongos
实例的配置文件中包含以下 TLS/SSL 设置:
注意
您可以使用适用于 Windows 和 macOS 的系统 SSL 证书存储区。要使用系统 SSL 证书存储区,请指定 net.ssl.certificateSelector
而不是指定证书密钥文件。
设置 | 注意 |
---|---|
设置为 此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您还可指定 | |
重要
在启动启用了 TLS/SSL 的 mongod
实例时,您必须指定 --tlsCAFile
标记、net.tls.CAFile
配置选项或 tlsUseSystemCA
参数的值。
--tlsCAFile
、tls.CAFile
和 tlsUseSystemCA
是互斥的。
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 实例。
提示
另请参阅:
为客户端阻止已撤销的证书
注意
操作过程使用 net.tls
设置。有关使用 net.ssl
设置的操作过程,请参阅操作过程(使用 net.ssl
设置)。
要防止已撤销证书的客户端连接到mongod
或mongos
实例,您可以使用证书撤销列表 (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_0
或 TLS1_1
的传入连接
net: tls: mode: requireTLS certificateKeyFile: /etc/ssl/mongodb.pem CAFile: /etc/ssl/caToValidateClientCertificates.pem disabledProtocols: TLS1_0,TLS1_1
TLS/SSL 证书密码。
如果 mongod
/ mongos
的证书密钥文件已加密,请将 net.tls.certificateKeyFilePassword
设置为密码。
提示
为避免指定明文密码,您可以在配置文件中使用扩展值。
提示
另请参阅:
您也可以使用命令行选项进行配置:
在线证书轮换
从 MongoDB 5.0 开始,您可按需轮换以下证书密钥文件:
CRL (Certificate Revocation List) files
(在 Linux 和 Windows 平台上)
轮换一个或多个证书:
替换您要在文件系统中轮换的证书,并注意以下限制:
每个新证书的文件名和文件路径必须与被替换的证书相同。
如果轮换加密的
TLS Certificate
,其密码必须与旧证书的密码相同(如certificateKeyFilePassword
配置文件设置所指定)。证书轮换不支持交互式密码提示。
运行
rotateCertificates
命令或db.rotateCertificates()
Shell 方法来轮换mongod
或mongos
实例使用的证书。
当证书轮换发生时:
证书文件错误、过期、撤销或丢失会导致证书轮换失败,但不会导致现有 TLS 配置失效或终止正在运行的 mongod
或 mongos
进程。
在 MongoDB 5.0 之前,证书轮换需要停机,并且通常在维护窗口期间执行。
有关其他注意事项和完整的使用说明,请参阅 rotateCertificates
或 db.rotateCertificates()
。
在 FIPS 模式下运行
注意
只有 MongoDB Enterprise 支持与 FIPS 兼容的 TLS/SSL。有关更多信息,请参阅为 FIPS 配置 MongoDB 。
请参阅为 FIPS 配置 MongoDB,了解详情。
后续步骤
如需为客户端配置 TLS/SSL 支持,请参阅客户端的 TLS/SSL 配置。
过程(使用 net.ssl
设置)
注意
MongoDB 提供与 net.ssl
设置(和 --ssl
命令行选项)相对应的 net.tls
设置(和 --tls
命令行选项)。由于 MongoDB 始终支持 TLS 1.0 及更高版本,因此新的 tls
设置可提供与 ssl
设置相同的功能。
本部分中的过程将使用 net.ssl
设置。有关使用 net.tls
别名的过程,请参阅过程(使用 net.tls
设置)。
使用 TLS/SSL 证书和密钥设置 mongod
和 mongos
以下部分将配置 mongod
/ mongos
以使用 TLS/SSL 连接。通过这些 TLS/SSL 设置,mongod
/ mongos
会将其证书密钥文件提供给客户端。但是,mongod
/ mongos
并不要求客户端提供证书密钥文件来验证客户端的身份。如要更改设置以要求客户端提供证书密钥文件,请参阅使用客户端证书验证设置 mongod
和 mongos
。
要使用 TLS/SSL 连接,请在 mongod
/ mongos
实例的配置文件中包含以下 TLS/SSL 设置:
设置 | 注意 |
---|---|
net.ssl.mode | 设置为 此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您也可指定 |
net.ssl.PEMKeyFile |
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 | 设置为 此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您也可指定 |
net.ssl.certificateSelector | 设置为属性( 此设置用于选择证书。请参阅 |
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 连接的更多信息。
使用客户端证书验证设置 mongod
和 mongos
以下部分将配置 mongod
/ mongos
以使用 TLS/SSL 连接并执行客户端证书验证。通过这些 TLS/SSL 设置:
要使用 TLS/SSL 连接,请在 mongod
/ mongos
实例的配置文件中包含以下 TLS/SSL 设置:
注意
您可以使用适用于 Windows 和 macOS 的系统 SSL 证书存储区。要使用系统 SSL 证书存储区,请指定 net.ssl.certificateSelector
而不是指定证书密钥文件。
设置 | 注意 |
---|---|
net.ssl.mode | 设置为 此设置会限制每个服务器仅使用 TLS/SSL 加密连接。您也可指定 |
net.ssl.PEMKeyFile | |
net.ssl.CAFile |
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 实例。
提示
另请参阅:
为客户端阻止已撤销的证书
要防止已撤销证书的客户端连接到mongod
或mongos
实例,您可以使用证书撤销列表 (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_0
或 TLS1_1
的传入连接
net: ssl: mode: requireSSL PEMKeyFile: /etc/ssl/mongodb.pem CAFile: /etc/ssl/caToValidateClientCertificates.pem disabledProtocols: TLS1_0,TLS1_1
TLS/SSL 证书密码。
如果 mongod
/ mongos
的证书密钥文件已加密,请将 net.ssl.PEMKeyPassword
设置为密码。
在 FIPS 模式下运行
注意
只有 MongoDB Enterprise 支持与 FIPS 兼容的 TLS/SSL。有关更多信息,请参阅为 FIPS 配置 MongoDB 。
请参阅为 FIPS 配置 MongoDB,了解详情。
后续步骤
如需为客户端配置 TLS/SSL 支持,请参阅客户端的 TLS/SSL 配置。