文档菜单
文档首页
/
MongoDB 手册
/ /

使用 x.509 证书在自管理部署上验证客户端

本页面

  • 先决条件
  • 步骤
  • 下一步

以下步骤为单实例设置 x.509 证书客户端验证。这也被称为相互 TLS 或 mTLS。mongod

要使用 x.509 认证来配置副本集或分片集群,请参阅使用自托管 MongoDB 的 x.509 证书进行成员身份认证。

关于 TLS/SSL、PKI(公钥基础设施)证书,尤其是 x.509 证书以及证书授权中心的详细描述超出了本文档的范围。本教程假定您已具备 TLS/SSL 的知识,并能够访问有效的 x.509 证书。

对于生产使用,您的 MongoDB 部署应使用由证书授权中心生成和签名的有效证书。您或您的组织可以生成和维护一个独立的证书授权中心,或使用第三方 TLS 提供商生成的证书。获取和管理证书超出了本文档的范围。

要使用 x.509 认证,必须指定 --tlsCAFilenet.tls.CAFile,除非您正在使用 --tlsCertificateSelector--net.tls.certificateSelector

您必须拥有有效的 x.509 证书。客户端 x.509 证书必须满足客户端证书要求。

如果您指定了 --tlsAllowInvalidCertificatesnet.tls.allowInvalidCertificates: true,无效的证书仅足以建立 TLS 连接,但不足以进行身份验证。

1

您可以从命令行配置用于 x.509 认证的 mongod 实例。

要配置独立的 mongod 实例,请运行以下命令

mongod --tlsMode requireTLS \
--tlsCertificateKeyFile <path to TLS/SSL certificate and key PEM file> \
--tlsCAFile <path to root CA PEM file> --bind_ip <hostnames>

根据您的配置需要包含附加选项。

x.509 配置需要

选项
备注
指定 requireTLS
指定实例的 x.509 证书以向客户端展示。
指定用于验证实例接收到的证书的证书颁发机构文件。

您可以在 mongod 的配置文件中配置用于 x.509 认证的 mongod

要配置一个独立的 mongod 实例,请将以下配置选项添加到您的配置文件中

net:
tls:
mode: requireTLS
certificateKeyFile: <path to TLS/SSL certificate and key PEM file>
CAFile: <path to root CA PEM file>

根据您的配置需要包含附加选项。

x.509 配置需要

选项
备注
指定 requireTLS
指定实例的 x.509 证书以向客户端展示。
指定用于验证实例接收到的证书的证书颁发机构文件。

要设置副本集或分片集群的 x.509 认证,请参阅使用自管理 MongoDB 的 x.509 证书进行成员认证。

2

要使用客户端证书进行认证,您必须先将客户端证书中 subject 的值添加到 $external 数据库中的 MongoDB 用户。每个唯一的 x.509 客户端证书对应一个 MongoDB 用户。您不能使用单个客户端证书来认证多个 MongoDB 用户。

注意

用户名要求

  • 要使用 客户端会话和因果一致性保证$external 认证用户(Kerberos、LDAP 或 x.509 用户),用户名长度不能超过 10k 字节。

  • subject 字符串中的 RDN 必须与以下RFC2253 标准兼容。

  1. 您可以使用以下命令从客户端证书中检索格式为 RFC2253subject

    openssl x509 -in <pathToClientPEM> -inform PEM -subject -nameopt RFC2253

    该命令返回 subject 字符串和证书

    subject= CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry
    -----BEGIN CERTIFICATE-----
    # ...
    -----END CERTIFICATE-----
  2. subjectRFC2253 合规值添加为用户。根据需要省略空格。

    以下示例添加了一个用户,并在 test 数据库中授予用户 readWrite 角色和在所有数据库中的 userAdminAnyDatabase 角色权限

    db.getSiblingDB("$external").runCommand(
    {
    createUser: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry",
    roles: [
    { role: "readWrite", db: "test" },
    { role: "userAdminAnyDatabase", db: "admin" }
    ],
    writeConcern: { w: "majority" , wtimeout: 5000 }
    }
    )

    有关添加带角色用户的详细信息,请参阅 在自托管部署上管理用户和角色

3

在您已将 将 x.509 客户端证书主题添加为相应的 MongoDB 用户 后,您可以使用客户端证书进行身份验证

要在连接时进行身份验证,请运行以下命令

mongosh --tls --tlsCertificateKeyFile <path to client PEM file> \
--tlsCAFile <path to root CA PEM file> \
--authenticationDatabase '$external' \
--authenticationMechanism MONGODB-X509
选项
备注
指定客户端的 x.509 文件。
指定用于验证由 mongod 实例提供的证书的证书颁发机构文件。
指定 '$external'
指定 MONGODB-X509

您可以在不进行身份验证的情况下连接,并在连接后使用 db.auth() 方法进行身份验证。

例如,如果使用 mongosh

  1. mongosh 连接到 mongod:

    mongosh --tls --tlsCertificateKeyFile <path to client PEM file> \
    --tlsCAFile <path to root CA PEM file>
    选项
    备注
    指定客户端的 x.509 文件。
    指定用于验证由 mongodmongos 实例提供的证书的证书颁发机构文件。
  2. 要进行身份验证,请在 $external 数据库中使用 db.auth() 方法。对于 mechanism 字段,指定 "MONGODB-X509"

    db.getSiblingDB("$external").auth(
    {
    mechanism: "MONGODB-X509"
    }
    )

要使用 x.509 认证来配置副本集或分片集群,请参阅使用自托管 MongoDB 的 x.509 证书进行成员身份认证。

返回

x.509