MongoDB 6.0 分片集群不支持密钥文件内部认证,因其已被官方弃用;必须使用X.509证书或Kerberos(Enterprise版)实现组件间mTLS双向验证,且所有节点需严格配置TLS参数、DNS解析及CA信任链。

MongoDB 6.0 分片集群无法使用密钥文件做内部身份验证——它已被弃用,且在 6.0 中不兼容启动流程。 你如果照着旧教程执行 mongod --keyFile 或在 mongod.conf 里配 security.keyFile,节点会直接拒绝启动,并报错类似 Failed to load key file: Invalid argument 或静默失败。这不是配置错误,而是版本限制。
为什么 MongoDB 6.0 分片集群不支持密钥文件
从 MongoDB 5.0 开始,官方已移除对纯密钥文件内部认证的支持;6.0 完全依赖 X.509 证书或 Kerberos(仅 Enterprise)作为组件间通信的唯一合法内部身份验证机制。密钥文件仅保留在 4.4 及更早版本中,且仅适用于副本集(非分片)。分片集群在 6.0 中强制要求:
-
mongos与mongod(shard)、mongod(config server)之间必须通过 TLS 证书双向验证(mTLS) - 所有节点必须配置
net.tls.mode: requireTLS和net.tls.certificateKeyFile - 配置服务器(CSRS)和每个 shard 副本集都需启用
security.authorization: enabled,但内部通信不再走密钥文件路径
实际能用的安全配置路径(6.0 分片集群)
你必须切换到基于证书的方案。关键步骤不是“生成密钥文件”,而是:
- 为每个节点生成独立的 X.509 证书,CN 必须匹配其 DNS 主机名(如
shard1.example.com),不能是 IP - 所有证书必须由同一个 CA 签发,且 CA 证书需被每个节点通过
net.tls.CAFile加载 -
mongos配置中必须显式设置net.tls.allowConnectionsWithoutCertificates: false(禁用无证书连接) - 配置服务器副本集初始化时,必须在
rs.initiate()的members数组中使用host字段填入 DNS 名,例如"shard1.example.com:27017",而非"10.0.1.10:27017" - 客户端连接
mongos时,URI 必须带?tls=true&tlsCertificateKeyFile=client.pem,否则会被拒绝
容易踩的坑:DNS、权限、版本混搭
最常导致集群起不来的问题不是证书本身,而是环境细节:
- DNS 解析失败:
mongod启动时会反向解析自己的 bind IP 对应的 hostname,若/etc/hosts或 DNS 未正确定义,会卡在Waiting for connections之后立即退出,日志只显示Failed to resolve hostname - 证书权限错误:Linux 下
mongod进程用户(如mongodb)必须对.pem文件有读权限,且文件不能有 group/o 写权限(OpenSSL 拒绝加载) - 混用 6.0 和 7.0 配置:6.0 不识别
security.clusterAuthMode: x509(该参数在 7.0+ 才生效),若误加,节点启动失败但无明确提示 - 忽略 config server 的副本集要求:CSRS 必须是三节点副本集,且每个节点都必须启用 TLS;单节点 config server 在 6.0 中根本无法启动
真正麻烦的地方在于:6.0 分片集群的安全配置不是“加个密钥文件就完事”,而是整套 PKI 基础设施的落地。哪怕只漏掉一个 DNS 条目或证书链顺序错位,整个集群就会停在初始化阶段,且错误信息极其模糊。动手前务必确认所有主机名可双向解析、所有证书用 openssl verify -CAfile ca.pem node.pem 验证通过、所有配置项都在 6.0 文档的 net.tls.* 范围内。











