注意
从版本4.0开始,MongoDB在可用TLS 1.1+的系统上禁用对TLS 1.0加密的支持。有关更多详细信息,请参阅禁用TLS 1.0。
MongoDB支持用于安全TLS / SSL连接的 x.509证书身份验证
。x.509客户端身份验证允许客户端使用证书而非用户名和密码对服务器进行身份验证。以下教程概述了使用x.509对独立mongod实例进行客户端身份验证的步骤。
要将x.509身份验证用于副本集或分片群集,请参阅 使用x.509证书进行成员身份验证。
重要
TLS / SSL,PKI(公钥基础结构)证书(尤其是x.509证书)和证书颁发机构的完整描述不在本文档的范围之内。本教程假定您具有TLS / SSL的先验知识以及对有效x.509证书的访问权限。
对于生产用途,您的MongoDB部署应使用由单个证书颁发机构生成和签名的有效证书。您或您的组织可以生成和维护独立的证书颁发机构,也可以使用第三方TLS / SSL供应商生成的证书。获取和管理证书超出了本文档的范围。
重要
要使用x.509身份验证,--tlsCAFile或者net.tls.CAFile
必须指定,除非使用--tlsCertificateSelector或
--net.tls.certificateSelector。或者,如果使用ssl别名,
--sslCAFile或net.ssl.CAFile必须指定,除非使用
--sslCertificateSelector或net.ssl.certificateSelector。
注意
您必须具有有效的x.509证书。
从MongoDB 4.0开始,如果在使用x.509身份验证时指定
--sslAllowInvalidCertificates或
(或在MongoDB 4.2中为别名或
),则无效的证书仅足以建立TLS / SSL连接,但不足以进行身份验证。net.ssl.allowInvalidCertificates: true--tlsAllowInvalidateCertificatesnet.tls.allowInvalidCertificates: true
客户端证书必须具有以下属性:
单个证书颁发机构(CA)必须同时为客户端和服务器颁发证书。
客户端证书必须包含以下字段:
每个唯一的MongoDB用户必须具有唯一的证书。
客户端X.509证书的主题,其中包含了专有名称(DN),必须区别从一个的
成员X.509证书。具体而言,主题必须至少具有以下属性之一:组织(O),组织单位(OU)或域组件(DC)。
如果已tlsX509ClusterAuthDNOverride设置MongoDB部署
(从MongoDB 4.2开始可用),则客户端x.509证书的主题也必须与此值不同。
警告
如果客户端x.509证书的主题与成员x.509证书(或已
设置)具有相同的O,
OU和DC组合
,则该客户端将被标识为群集成员,并被授予对系统的完全权限。tlsX509ClusterAuthDNOverride
注意
本节中的过程使用tls设置/选项(在MongoDB 4.2中可用)。有关使用ssl
别名的过程,请参阅为x.509配置的MongoDB部署(使用SSL选项)。
的tls设置/选项提供了相同的功能性ssl选项,因为MongoDB中始终支持TLS 1.0和更高。
您可以mongod从命令行为x.509身份验证配置实例。例如,要配置独立mongod实例:
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定
--bind_ip。有关更多信息,请参见
Localhost绑定兼容性更改。
x.509配置需要:
| 选项 | 笔记 |
|---|---|
--tlsMode |
指定requireTLS。 |
--tlsCertificateKeyFile |
实例的x.509证书要呈现给客户端。 |
--tlsCAFile |
证书颁发机构文件,用于验证提供给实例的证书。 |
您可以mongod在配置文件中配置x.509身份验证。例如,要配置独立mongod实例:
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost绑定兼容性更改。
x.509配置需要:
| 选项 | 笔记 |
|---|---|
net.tls.mode |
指定requireTLS。 |
net.tls.certificateKeyFile |
实例的x.509证书。 |
net.tls.CAFile |
证书颁发机构文件,用于验证提供给实例的证书。 |
要为副本集或分片群集设置x.509身份验证,请参阅使用x.509证书进行成员身份验证。
注意
本节中的过程使用ssl设置/选项。有关使用其tls别名的过程(在MongoDB 4.2中可用),请参阅为x.509配置的MongoDB部署(使用TLS选项)。
的tls设置/选项提供了相同的功能性ssl选项,因为MongoDB中始终支持TLS 1.0和更高。
您可以mongod从命令行为x.509身份验证配置实例。例如,要配置独立mongod实例:
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定
--bind_ip。有关更多信息,请参见
Localhost绑定兼容性更改。
独立的x.509配置需要:
| 选项 | 笔记 |
|---|---|
--sslMode |
指定requireSSL。 |
--sslPEMKeyFile |
实例的x.509证书。 |
--sslCAFile |
证书颁发机构文件,用于验证提供给实例的证书。 |
您可以mongod
在配置文件中配置x.509身份验证。例如,要配置独立mongod实例:
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost绑定兼容性更改。
独立的x.509配置需要:
| 选项 | 笔记 |
|---|---|
net.ssl.mode |
指定requireSSL。 |
net.ssl.PEMKeyFile |
实例的x.509证书。 |
net.ssl.CAFile |
证书颁发机构文件,用于验证提供给实例的证书。 |
要为副本集或分片群集设置x.509身份验证,请参阅使用x.509证书进行成员身份验证。
subject为用户¶要使用客户端证书进行身份验证,您必须首先将subject来自客户端证书的的值作为MongoDB用户添加到
$external数据库中。每个唯一的x.509客户端证书都对应一个MongoDB用户;也就是说,您不能使用单个客户端证书来认证一个以上的MongoDB用户。
在版本3.6.3中更改:要与$external身份验证用户(即Kerberos,LDAP,x.509用户)一起使用会话,用户名不能大于10k字节。
注意
subject字符串中的RDN 必须与RFC2253标准兼容
。
您可以使用以下命令从客户端证书中检索RFC2253格式subject:
该命令返回subject字符串以及证书:
作为用户添加的RFC2253合规值subject。根据需要省略空间。
例如,以下代码添加了一个用户,并授予了该用户
readWrite在test数据库中的userAdminAnyDatabase角色以及该
角色:
有关添加具有角色的用户的详细信息,请参见管理用户和角色。
tls选项)¶注意
本节中的过程使用tls设置/选项(在MongoDB 4.2中可用)。有关使用其ssl
别名的过程,请参阅使用x.509证书进行身份验证(使用ssl选项)。
的tls设置/选项提供了相同的功能性ssl选项,因为MongoDB中始终支持TLS 1.0和更高。
在将x.509客户端证书主题添加为相应的MongoDB用户之后,可以使用客户端证书进行身份验证。
在连接期间进行身份验证:
| 选项 | 笔记 |
|---|---|
--tls |
|
--tlsCertificateKeyFile |
客户的x.509文件。 |
--tlsCAFile |
证书颁发机构文件,用于验证mongod
实例提供的证书
。 |
--authenticationDatabase |
指定'$external'。 |
--authenticationMechanism |
指定MONGODB-X509。 |
您可以在不进行身份验证的情况下进行连接,并使用连接后进行身份验证的
db.auth()方法。
例如,如果使用mongo外壳,
将mongoShell 连接到mongodTLS / SSL 的设置:
| 选项 | 笔记 |
|---|---|
--tls |
|
--tlsCertificateKeyFile |
客户的x.509文件。 |
--tlsCAFile |
证书颁发机构文件,以验证mongod/ mongos
实例提供的证书
。 |
要执行身份验证,请使用数据库中的db.auth()方法$external。对于该mechanism
字段,请指定"MONGODB-X509"。
ssl选项)¶注意
本节中的过程使用ssl设置/选项。有关使用其tls别名(在MongoDB 4.2中可用)别名的过程,请参阅使用x.509证书进行身份验证(使用tls选项)。
的tls设置/选项提供了相同的功能性ssl选项,因为MongoDB中始终支持TLS 1.0和更高。
在将x.509客户端证书主题添加为相应的MongoDB用户之后,可以使用客户端证书进行身份验证。
在连接期间进行身份验证:
| 选项 | 笔记 |
|---|---|
--ssl |
|
--sslPEMKeyFile |
客户的x.509文件。 |
--sslCAFile |
证书颁发机构文件,以验证mongod/ mongos
实例提供的证书
。 |
--authenticationDatabase |
指定'$external'。 |
--authenticationMechanism |
指定MONGODB-X509。 |
您可以在不进行身份验证的情况下进行连接,并使用连接后进行身份验证的
db.auth()方法。
例如,如果使用mongo外壳,
将mongoShell 连接到mongodTLS / SSL 的设置:
| 选项 | 笔记 |
|---|---|
--ssl |
|
--sslPEMKeyFile |
客户的x.509文件。 |
--sslCAFile |
证书颁发机构文件,以验证mongod/ mongos
实例提供的证书
。 |
要执行身份验证,请使用数据库中的db.auth()方法$external。对于该mechanism
字段,请指定"MONGODB-X509"。