配置mongod
和 mongos
的 TLS/SSL 配置
本页内容
概述
本文档帮助您配置新的 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.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
检查。如果您的配置文件中的
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)。然而,根据 RFC2818,这种 CN 的使用已被弃用。RFC2818如果用作
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/SSL 证书,或自签名证书。如果您使用自签名证书,尽管通信通道将被加密以防止监听连接,但将没有对服务器身份的验证。这会使您易受中间人攻击。使用由受信任的证书颁发机构签发的证书将允许 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
实例的 configuration file
中包含以下 TLS/SSL 设置:
设置 | 说明 |
---|---|
设置为 此设置限制每个服务器只能使用 TLS/SSL 加密连接。您也可以指定 | |
例如,以下是一个 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
而不是指定证书密钥文件。
设置 | 说明 |
---|---|
设置为 此设置限制每个服务器只能使用 TLS/SSL 加密连接。您也可以指定 | |
设置为属性(可以是 此设置用于选择证书。有关详细信息,请参阅 |
例如,以下是一个 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 实例
。
提示
另请参阅
您还可以通过命令行选项而不是配置文件来配置 mongod
和 mongos
关于
mongod
,请参阅:--tlsMode
;--tlsCertificateKeyFile
;以及--tlsCertificateSelector
。关于
mongos
,请参阅:--tlsMode
;--tlsCertificateKeyFile
;以及--tlsCertificateSelector
。
使用客户端证书验证设置 mongod
和 mongos
以下部分配置 mongod
/ mongos
使用 TLS/SSL 连接并执行客户端证书验证。使用这些 TLS/SSL 设置
注意
该程序使用 net.tls
设置。有关使用 net.ssl
设置的程序,请参阅 程序(使用 net.ssl
设置)。
要使用 TLS/SSL 连接并执行客户端证书验证,请将以下 TLS/SSL 设置 包含在您的 mongod
/ mongos
实例的 配置文件 中:
注意
您可以使用Windows和macOS的系统SSL证书存储。要使用系统SSL证书存储,请指定 net.ssl.certificateSelector
而不是指定证书密钥文件。
设置 | 说明 |
---|---|
设置为 此设置限制每个服务器只能使用 TLS/SSL 加密连接。您也可以指定 | |
重要
当使用TLS/SSL启用启动 mongod
实例时,您必须指定 --tlsCAFile
标志、net.tls.CAFile
配置选项或 tlsUseSystemCA
参数的值。
--tlsCAFile
、tls.CAFile
和 tlsUseSystemCA
互斥。
例如,以下是一个 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实例。
提示
另请参阅
您还可以通过命令行选项而不是配置文件来配置 mongod
和 mongos
有关
mongod
,请参阅--tlsMode
、--tlsCertificateKeyFile
和--tlsCAFile
。有关
mongos
,请参阅--tlsMode
、--tlsCertificateKeyFile
和--tlsCAFile
.
阻止客户端的吊销证书
注意
此过程使用 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 (证书吊销列表) 文件
(在Linux和Windows平台上)
要轮换一个或多个证书
在文件系统中替换您希望轮换的证书或证书,注意以下限制
每个新证书必须与被替换的证书具有相同的文件名和文件路径。
如果您正在轮换加密的
TLS证书
,则其密码必须与旧证书的密码相同(如配置文件中的certificateKeyFilePassword
设置所指定)。证书轮换不支持交互式密码提示。
运行
rotateCertificates
命令或db.rotateCertificates()
shell方法,以轮换mongod
或mongos
实例使用的证书。
当进行证书轮换时
证书文件不正确、已过期、已被吊销或丢失将导致证书轮换失败,但不会使现有的 TLS 配置无效或终止正在运行的 mongod
或 mongos
进程。
MongoDB 5.0 之前,证书轮换需要停机,通常在维护窗口期间执行。
有关更多信息和使用说明,请参阅 rotateCertificates
或 db.rotateCertificates()
。
以 FIPS 模式运行
注意
FIPS 兼容的 TLS/SSL 只在 MongoDB Enterprise 中可用。有关更多信息,请参阅 为 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 连接,请将以下 TLS/SSL 设置包含在您的 mongod
/ mongos
实例的 配置文件 中:
设置 | 说明 |
---|---|
net.ssl.mode | 设置为 此设置限制每个服务器只能使用TLS/SSL加密连接。您还可以指定 |
net.ssl.PEMKeyFile |
例如,以下是一个 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 | 设置为 此设置限制每个服务器只能使用TLS/SSL加密连接。您还可以指定 |
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 实例
。
设置带有客户端证书验证的 mongod
和 mongos
以下部分配置 mongod
/ mongos
使用 TLS/SSL 连接并执行客户端证书验证。使用这些 TLS/SSL 设置
要使用 TLS/SSL 连接,请将以下 TLS/SSL 设置包含在您的 mongod
/ mongos
实例的 配置文件 中:
注意
您可以使用Windows和macOS的系统SSL证书存储。要使用系统SSL证书存储,请指定 net.ssl.certificateSelector
而不是指定证书密钥文件。
设置 | 说明 |
---|---|
net.ssl.mode | 设置为 此设置限制每个服务器只能使用TLS/SSL加密连接。您还可以指定 |
net.ssl.PEMKeyFile | |
net.ssl.CAFile |
例如,以下是一个 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实例。
提示
另请参阅
阻止客户端吊销证书
为了防止具有吊销证书的客户端连接到 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 模式运行
注意
FIPS 兼容的 TLS/SSL 只在 MongoDB Enterprise 中可用。有关更多信息,请参阅 为 FIPS 配置 MongoDB。
有关详细信息,请参阅 为 FIPS 配置 MongoDB。
下一步操作
要配置客户端的 TLS/SSL 支持,请参阅 客户端的 TLS/SSL 配置。