必须将clusterAuthMode显式设为x509,否则即使证书正确也无效;须彻底移除keyFile(配置和命令行),且所有节点subject.O一致、CN唯一并严格匹配rs.initiate()中的host。

必须显式设置 clusterAuthMode: x509,否则证书完全不生效——哪怕所有证书都正确生成、路径无误,节点间仍走 keyfile 模式。
clusterAuthMode 必须设为 x509,且不能残留 keyFile
这是最常踩的坑:只配了证书却忘了改这个参数,或者删了配置里的 keyFile 但启动命令里还带着 --keyFile。
-
clusterAuthMode控制的是「节点间通信」的认证方式,和客户端用的authMechanism无关 - 必须在每个节点的配置文件中写死:
security:<br> clusterAuthMode: x509
或启动时加--clusterAuthMode x509 -
sendX509和sendKeyFile都不行:前者只发证书不验对方,后者直接回退到 keyfile - 只要
security.keyFile字段存在、或命令行含--keyFile,mongod 就会忽略clusterAuthMode并警告:Ignoring clusterAuthMode=x509 because keyFile is set - 重启前务必执行
ps aux | grep mongod确认没残留--keyFile
节点证书 subject.O 和 CN 必须严格满足集群要求
MongoDB 不是简单地“验证证书是否可信”,而是用 subject.O 和 subject.CN 做节点身份识别。错一个字段,副本集就起不来。
- 所有节点证书必须由同一 CA 签发,且每个节点的
sslCAFile都指向同一个ca.pem -
subject.O(Organization)必须完全一致,例如/O=MyMongoCluster;大小写、空格、标点都不能差 -
subject.CN(Common Name)必须唯一,且必须和rs.initiate()里写的 host 完全匹配(包括域名后缀、端口不写进 CN) - 生成示例:
openssl req -subj "/O=MyMongoCluster/CN=node1.example.com" - 如果两个节点用了相同 CN,初始化会报:
Cannot add host with duplicate key: { host: "node2:27017" }
私钥权限和证书链完整性直接影响 mongod 启动
权限不对或链不全,mongod 直接拒绝启动,不会给你连上再报错的机会。
- 节点私钥文件必须是
chmod 600,否则日志报:SSL context setup failed: private key permissions too open - 证书链要完整:节点证书 → 中间 CA(如有)→ 根 CA;
sslCAFile只需指向根 CA,但节点证书本身必须包含完整链(或单独配sslCRLFile) -
sslPEMKeyFile必须是 PEM 格式,且同时含证书和私钥(顺序无所谓,但不能分开);若分开,得用sslCertificateKeyFile+sslPrivateKeyFile(4.4+ 已弃用) - 证书有效期、域名匹配、密钥长度(建议 ≥2048)也要合规,否则 TLS 握手失败前 mongod 就已退出
rs.initiate() 的 host 必须和证书 CN 一字不差
副本集初始化不是“连得上就行”,而是 MongoDB 在握手阶段就比对 CN 和成员列表中的 host 字符串。
- 假设节点证书 CN 是
node1.example.com,那rs.initiate()必须写:rs.initiate({<br> _id: "rs0",<br> members: [<br> { _id: 0, host: "node1.example.com:27017" }<br> ]<br>}) - 大小写敏感:
Node1.example.com≠node1.example.com - 不能用 IP:即使 DNS 解析正常,CN 是域名,host 就不能填
10.0.1.10:27017 - 日志若出现:
Unable to reach primary for set rs0: SSL peer cert,八成是 CN 和 host 不一致 - 确认 CN 值可用:
openssl x509 -noout -subject -in node1.pem -nameopt RFC2253
真正卡住人的从来不是生成证书,而是 clusterAuthMode 是否生效、keyFile 是否清干净、CN 和 host 是否镜像一致——这三个点漏掉任意一个,集群就停在“看似配好了,实则没跑通”的状态。


















