Docs 菜单

Docs 主页开发应用程序MongoDB Manual

x.509

在此页面上

  • 证书颁发机构
  • 客户端 x.509 证书
  • 成员 x.509 证书

MongoDB 支持将 x.509 证书身份验证用于客户端身份验证,以及副本集和分片集群成员的内部身份验证。

x.509 证书身份验证需要安全的 TLS/SSL 连接。

对于生产用途,MongoDB 部署应使用由证书颁发机构生成和签名的有效证书。您或您的组织可以生成并维护独立的证书颁发机构,或使用第三方 TLS 供应商生成的证书。获取和管理证书超出了本文档的范围。

要对服务器进行身份验证,客户端可以使用 x.509 证书来替代用户名和密码。

客户端证书要求:

  • 必须由一个证书颁发机构 (CA) 同时向客户端和服务器颁发证书。

  • 每个唯一的 MongoDB 用户必须拥有唯一的证书。

  • x.509 证书不能过期。

    注意

  • 客户端证书必须包含以下字段:

    keyUsage = digitalSignature
    extendedKeyUsage = clientAuth
  • 以下客户端证书属性中至少有一个必须与 net.tls.clusterFilenet.tls.certificateKeyFile 服务器证书中的属性不同

    • 组织 (O)

    • 组织单位 (OU)

    • 域组件 (DC)

    注意

    您还可以在启动期间禁用enforceUserClusterSeparation参数,以自动禁用O/OU/DC检查。这允许成员证书以存储在$external数据库中的用户身份进行身份验证。

  • 包含标识名 (DN) 的客户端 x.509 证书的 subject 必须与成员 x.509 证书subject 不同

    重要

    如果客户端 x.509 证书的主题与成员 x.509 证书(或 tlsX509ClusterAuthDNOverride,如果设置)的 OOUDC 属性完全匹配,则会接受该客户端连接并授予完整权限,且会在日志中显示一条警告消息。

    只有集群成员 x509 证书应使用相同的 OOUDC 属性组合。

    版本 4.2 中的新增功能:如果 MongoDB 部署设置了tlsX509ClusterAuthDNOverride,则客户端 x.509 证书的主题不得与该值匹配。

要使用客户端证书进行身份验证,您必须先将客户端证书的 subject 作为 MongoDB 用户添加到 $external 数据库中。$external 数据库是用户的身份验证数据库

每个唯一的 x.509 客户端证书对应一个 MongoDB 用户。您不能使用一个客户端证书验证多个 MongoDB 用户。

要对 $external 身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。

从 MongoDB 5.0 开始,mongodmongos 现在会在其证书不包含主题备用名称属性时,在启动阶段发出警告。

以下平台不支持通用名称验证:

  • iOS 13 及更高版本

  • MacOS 10.15 及更高版本

  • Go 1.15 及更高版本

使用这些平台的客户端不会向使用 x.509 证书(其主机名由 CommonName 属性指定)的 MongoDB 服务器进行身份验证

对于分片集群成员和副本集成员之间的内部身份验证,您可以使用 x.509 证书来替代密钥文件

使用成员证书来验证分片集群或副本集的成员资格。成员证书文件路径用 net.tls.clusterFilenet.tls.certificateKeyFile 选项配置。成员具有以下配置要求:

  • 集群成员配置必须为至少一个用于身份验证的属性指定非空值。默认情况下,MongoDB 接受:

    • 组织 (O)

    • 组织单位 (OU)

    • 域组件 (DC)

    您可以通过设置 net.tls.clusterAuthX509.extensionValue 来指定用于身份验证的替代属性。

  • 集群成员配置必须包含相同的 net.tls.clusterAuthX509.attributes 并使用匹配值。属性顺序不重要。以下示例设置 OOU,但不设置 DC

    net:
    tls:
    clusterAuthX509:
    attributes: O=MongoDB, OU=MongoDB Server

注意

如果禁用enforceUserClusterSeparation参数,则应用以下行为:

  • 如果配置文件中的clusterAuthModekeyFile ,则会禁用O/OU/DC检查。这允许拥有成员证书的客户端以$external数据库中存储的用户身份进行身份验证。

  • 如果配置文件中的clusterAuthMode不是keyFile ,则服务器不会启动。

如果将enforceUserClusterSeparation参数设置为false ,则服务器不区分应用程序用于进行身份验证的客户端证书和具有特权访问权限的集群内证书。如果您的clusterAuthModekeyFile ,则此操作无效。但是,如果clusterAuthModex509 ,则使用允许模式的用户证书将与集群证书合并并授予特权访问权限。

如果执行以下操作,您的现有证书将被授予内部特权:

  1. 使用此参数允许的名称创建一个用户。

  2. enforceUserClusterSeparation参数设置为false

  3. 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

您可以使用 TLS 在副本集(每个mongod 实例)或分片集群(每个 mongodmongos 实例)的每个节点之间进行内部身份验证。

要使用 TLS 进行内部身份验证,请使用以下设置:

mongodmongos 实例使用证书密钥文件向客户端证明自己的身份,但证书密钥文件也可用于成员身份验证。如果不指定集群文件,成员将使用其证书密钥文件进行成员身份验证。使用 net.tls.certificateKeyFile--tlsCertificateKeyFile 指定证书密钥文件(从 MongoDB 4.2 开始可用)。

要将证书密钥文件同时用于客户端身份验证和成员资格身份验证,证书必须满足以下任一条件:

  • 省略 extendedKeyUsage

  • 指定 extendedKeyUsage = serverAuth, clientAuth

← 使用 SCRAM 对客户端进行身份验证