x.509
MongoDB支持用于客户端身份验证验证的 X.509 证书身份身份验证以及副本集和分片的集群成员的内部身份验证。
x.509 证书身份验证需要安全的 TLS/SSL 连接。
证书颁发机构
对于生产用途,MongoDB 部署应使用由证书颁发机构生成和签名的有效证书。您或您的组织可以生成并维护独立的证书颁发机构,或使用第三方 TLS 供应商生成的证书。获取和管理证书超出了本文档的范围。
客户端 X.509 证书
要对服务器进行身份验证,客户端可以使用 X.509 证书而不是用户名和密码。
客户端证书要求
客户端证书要求:
必须由一个证书颁发机构 (CA) 同时向客户端和服务器颁发证书。
每个唯一的 MongoDB 用户必须拥有唯一的证书。
X.509 证书不得过期。
客户端证书必须包含以下字段:
keyUsage = digitalSignature extendedKeyUsage = clientAuth 以下客户端证书属性中至少有一个必须与
net.tls.clusterFile
和net.tls.certificateKeyFile
服务器证书中的属性不同:组织 (
O
)组织单位 (
OU
)域组件 (
DC
)
客户端 x.509 证书的
subject
包含标识名 (DN
),必须与成员 x.509 证书的subject
不同。如果 MongoDB 部署设置了tlsX509ClusterAuthDNOverride
,则客户端 x.509 证书的主题不得与该值匹配。重要
如果客户端X.509 证书的主题与 成员 X.509 证书 的
O
、OU
和DC
属性(或tlsX509ClusterAuthDNOverride
,如果设立)完全匹配,则接受客户端连接,将授予完全权限,并在日志中显示警告消息。只有集群成员 x509 证书应使用相同的
O
、OU
和DC
属性组合。
MongoDB 用户和 $external
数据库
要使用客户端证书进行身份验证,您必须先将客户端证书的 subject
作为 MongoDB 用户添加到 $external
数据库中。$external
数据库是用户的身份验证数据库。
每个唯一的 X.509客户端证书均适用于一个MongoDB用户。您不能使用单个客户端证书对多个MongoDB用户进行身份验证。
要对 $external
身份验证用户(Kerberos、LDAP 或 X.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。
TLS 连接 X509 证书启动警告
从 MongoDB 5.0 开始,mongod
和 mongos
现在会在其证书不包含主题备用名称属性时,在启动阶段发出警告。
以下平台不支持通用名称验证:
iOS 13 及更高版本
MacOS 10.15 及更高版本
Go 1.15 及更高版本
使用这些平台的客户端不会向使用 X.509 证书(其主机名由 CommonName 属性指定)的 MongoDB 服务器进行身份验证。
成员 X.509 证书
对于分片的集群成员和副本集成员之间的内部身份验证,您可以使用 X.509 证书而不是密钥文件。
成员证书要求
使用成员证书验证分片集群或副本集的成员资格。 成员证书存储在net.tls.clusterFile
和net.tls.certificateKeyFile
中。 成员证书要求:
必须由一个证书颁发机构 (CA) 同时向分片集群或副本集成员颁发所有 x.509 证书。
x.509 证书不能过期。
在成员证书的
subject
中找到的标识名 (DN
) 必须为以下至少一个属性指定非空值:组织 (
O
)组织单位 (
OU
)域组件 (
DC
)
在多集群部署中,每个集群必须使用不同的 X. 509成员证书。 每个证书的
O
、OU
和DC
标识名 (DN) 字段必须具有唯一值。如果两个集群的证书具有相同 DN 值,则一个集群上的受感染服务器可以作为另一个集群的成员进行身份验证。
每个集群成员证书必须在其
net.tls.clusterFile
和net.tls.certificateKeyFile
证书中具有相同的O
、OU
和DC
。 这也适用于tlsX509ClusterAuthDNOverride
值(如果已设置)。 属性顺序并不重要。以下是一个示例。 下面的两个
DN
具有匹配的O
和OU
规范,并且未指定DC
。CN=host1,OU=Dept1,O=MongoDB,ST=NY,C=US C=US, ST=CA, O=MongoDB, OU=Dept1, CN=host2 以下示例不正确,因为
DN
不匹配。 一个DN
有两个OU
规范,另一个OU
只有一个规范。CN=host1,OU=Dept1,OU=Sales,O=MongoDB CN=host2,OU=Dept1,O=MongoDB 公用名 (
CN
) 或主题备用名称 (SAN
) 条目之一必须与其他集群成员的服务器主机名匹配。 从 MongoDB 4.2 开始,在比较SAN
时,MongoDB 可以比较 DNS 名称或 IP 地址。 在以前的版本中,MongoDB 仅比较 DNS 名称。例如,集群的证书可以包含以下
subject
:subject= CN=<myhostname1>,OU=Dept1,O=MongoDB,ST=NY,C=US subject= CN=<myhostname2>,OU=Dept1,O=MongoDB,ST=NY,C=US subject= CN=<myhostname3>,OU=Dept1,O=MongoDB,ST=NY,C=US 如果用作
certificateKeyFile
的证书包含extendedKeyUsage
,则该值必须同时包含clientAuth
(“TLS Web 客户端身份验证”)和serverAuth
(“TLS Web 服务器身份验证”)。extendedKeyUsage = clientAuth, serverAuth 如果用作
clusterFile
的证书包含extendedKeyUsage
,则该值必须包含clientAuth
。extendedKeyUsage = clientAuth
用于成员资格身份验证的 MongoDB 配置
您可以使用 TLS 在副本集(每个mongod
实例)或分片集群(每个 mongod
和 mongos
实例)的每个节点之间进行内部身份验证。
要使用 TLS 进行内部身份验证,请使用以下设置:
重要
如果将--tlsMode
设立为 disabled
以外的任何值,则 MongoDB 将使用net.tls.certificateKeyFile
中指定的证书对内部副本集连接中的服务器和客户端身份验证。无论您是否将security.clusterAuthMode
设立为 X.509
,此证书设置都适用。
mongod
和 mongos
实例使用证书密钥文件向客户端证明自己的身份,但证书密钥文件也可用于成员身份验证。如果不指定集群文件,成员将使用其证书密钥文件进行成员身份验证。用 net.tls.certificateKeyFile
或 --tlsCertificateKeyFile
指定证书密钥文件。
要将证书密钥文件同时用于客户端身份验证和成员资格身份验证,证书必须满足以下任一条件:
省略
extendedKeyUsage
或指定
extendedKeyUsage = serverAuth, clientAuth