clusterAuthMode必须设为x509才能启用节点间x.509证书认证,且须移除keyFile、确保CA一致、subject.O相同CN唯一、host与CN完全匹配、证书链完整、私钥权限严格。

clusterAuthMode 参数必须设为 x509 才能启用证书鉴权
仅配置 x.509 证书但没改 clusterAuthMode,集群节点间仍走默认的 keyfile 认证,证书完全不生效。该参数控制的是「节点间通信」的认证方式,和客户端连接的 authMechanism 是两回事。
必须在每个节点的配置文件中显式设置:
security: clusterAuthMode: x509
或启动时加参数:--clusterAuthMode x509。注意:不能设为 sendX509 或 sendKeyFile,前者只发证书不验证对方,后者直接退回到 keyfile 模式。
节点证书的 subject 必须含 /O=“yourOrgName” 且 CN 唯一
MongoDB 要求所有参与集群的节点证书,其 subject.O(Organization)字段必须完全一致,且 subject.CN(Common Name)必须唯一——这是它识别不同节点身份的依据。如果两个节点用了相同 CN,副本集初始化会失败,报错类似:Cannot add host with duplicate key: { host: "node2:27017" }。
生成证书时需确保:
openssl req -subj "/O=MyMongoCluster/CN=node1.example.com"- 所有节点用同一根 CA 签发,且 CA 证书(
ca.pem)被所有节点的sslCAFile指向 - 节点证书私钥必须严格保护(
chmod 600),否则 mongod 拒绝启动并报SSL context setup failed: private key permissions too open
必须关闭 keyfile,且不能同时启用 keyfile 和 x509
只要配置了 keyFile,即使 clusterAuthMode 设为 x509,mongod 启动时也会强制忽略证书、回退到 keyfile 模式,并输出警告:Ignoring clusterAuthMode=x509 because keyFile is set。
正确做法是:
- 彻底删除配置中的
security.keyFile字段 - 确认没有通过
--keyFile启动参数残留 - 重启前检查
ps aux | grep mongod输出,确保命令行里没带--keyFile
否则你会看到节点日志反复打印 Failed to load keyfile: No such file or directory——它其实根本没想读证书,只是在找 keyfile。
副本集初始化时,initial members 的 host 必须和证书 CN 完全匹配
执行 rs.initiate() 时传入的成员列表,其 host 字段值(如 "node1.example.com:27017")必须与对应节点证书的 CN 完全一致(包括大小写和域名后缀),否则该节点无法加入集群,日志报:Unable to reach primary for set xxx: SSL peer certificate validation failed。
常见掉坑点:
- 用
localhost或127.0.0.1当 host,但证书 CN 是域名 —— 不匹配 - 证书 CN 是
node1,但rs.initiate()里写成node1.local—— DNS 解析通也不行,必须字面量一致 - 没在
net.ssl.PEMKeyFile指定完整证书链(含中间 CA),导致握手阶段对方无法验证你
证书路径、权限、subject 格式、配置开关、成员名匹配——这五处任意一个错,集群就起不来,而且错误信息往往藏在日志深处,不翻 grep -i ssl 很难定位。











