为 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 供应商生成的证书。获取和管理证书超出了本文档的范围。
成员证书要求
使用成员证书来验证分片集群或副本集的成员资格。成员证书文件路径用 net.tls.clusterFile
和 net.tls.certificateKeyFile
选项配置。成员具有以下配置要求:
集群成员配置必须为至少一个用于身份验证的属性指定非空值。默认情况下,MongoDB 接受:
组织 (
O
)组织单位 (
OU
)域组件 (
DC
)
您可以通过设置
net.tls.clusterAuthX509.extensionValue
来指定用于身份验证的替代属性。集群成员配置必须包含相同的
net.tls.clusterAuthX509.attributes
并使用匹配值。属性顺序不重要。以下示例设置O
和OU
,但不设置DC
:net: tls: clusterAuthX509: attributes: O=MongoDB, OU=MongoDB Server
注意
如果禁用enforceUserClusterSeparation
参数,则应用以下行为:
如果配置文件中的
clusterAuthMode
为keyFile
,则会禁用O/OU/DC
检查。 这允许拥有成员证书的客户端以$external
数据库中存储的用户身份进行身份验证。如果配置文件中的
clusterAuthMode
不是keyFile
,则服务器不会启动。
如果将enforceUserClusterSeparation
参数设置为false
,则服务器不区分应用程序用于进行身份验证的客户端证书和具有特权访问权限的集群内证书。 如果您的clusterAuthMode
为keyFile
,则此操作无效。 但是,如果clusterAuthMode
为x509
,则使用允许模式的用户证书将与集群证书合并并授予特权访问权限。
如果执行以下操作,您的现有证书将被授予内部特权:
使用此参数允许的名称创建一个用户。
将
enforceUserClusterSeparation
参数设置为false
。将
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
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 配置。