必须启用net.tls.clusterauthx509并配齐证书链,否则节点间通信明文传输;该方案强制双向tls认证与加密,要求统一ca签发、严格校验o/ou字段、subjectaltname覆盖所有访问地址,且禁用弃用ssl配置项。

必须启用 net.tls.clusterAuthX509 并配齐证书链,否则节点间通信明文传输,中间人可直接解密、伪造或劫持心跳与复制流量。
为什么 clusterAuthX509 是唯一可靠方案
副本集或分片集群内部通信(如 oplog 同步、心跳检测、配置传播)默认不校验证书主体,仅靠密钥文件或 SCRAM 无法防中间人——它们只做身份认证,不加密信道。只有 clusterAuthX509 强制双向 TLS 认证+加密,且要求每个节点用独立证书,由同一 CA 签发并严格校验 O 和 OU 字段。
常见错误现象:SSL handshake failed: certificate verification failed;Failed to connect to node X: No suitable servers found;日志里反复出现 connection refused 但端口实际通——本质是 TLS 握手卡在 subject 校验阶段。
-
O(Organization)和OU(Organizational Unit)必须完全一致,大小写、空格、顺序都不能差,例如所有节点 CSR 都填OU=MongoDB Server,不能有的写OU=Server、有的写OU=mongodb-server - CAFile 必须包含根 CA 证书(不是中间 CA),且能完整链到每个节点证书的签发者;若用私有 CA,需确保所有 mongod 进程启动时都能读取该文件
- 证书的
subjectAltName必须包含该节点的 DNS 主机名(如host1.internal)或 IP(如IP:10.1.2.3),不能只靠 CN 匹配
mongod.conf 中 tls 配置必须避开弃用键名
MongoDB 4.2+ 已彻底弃用 ssl 键名,但配置里混用 ssl: 和 tls: 不报错、不警告,只会静默忽略 TLS 设置——服务照常启动,连接也看似正常,实则所有通信裸奔。
正确写法只允许用 tls 下的子项:
net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb-node1.pem
CAFile: /etc/ssl/ca-root.pem
clusterFile: /etc/ssl/mongodb-cluster.pem # 必须独立于 certificateKeyFile
allowConnectionsWithoutCertificates: false
-
clusterFile必须指向专用于集群内认证的证书(通常与certificateKeyFile不同),其私钥不可用于客户端连接 - 路径权限必须 ≤600,属主为
mongod用户,否则启动失败并报Permission denied - 不能写
ssl: mode: requireSSL,哪怕只有一行,整个 tls 块都会失效
客户端连接命令漏参数 = 白启 TLS
只加 --tls 不等于启用证书校验:默认行为是跳过服务器证书验证,等效于明文传输。生产环境必须显式指定全部三项:
-
--tls(启用 TLS 协议) -
--tlsCAFile /path/to/ca.pem(提供可信根证书,强制校验服务端身份) -
--tlsCertificateKeyFile /path/to/client.pem(若服务端配置了allowConnectionsWithoutCertificates: false,此项必填)
错误示例:mongo --tls --host rs1.example.com → 证书未校验,中间人可伪造任意节点响应;mongo --tls --tlsCAFile ca.pem --host rs1.example.com → 若服务端要求客户端证书而你没提供,连接被拒。
连接字符串写法同理:mongodb://rs1.example.com:27017/?tls=true&tlsCAFile=/path/ca.pem&tlsCertificateKeyFile=/path/client.pem,缺任一参数都可能降级为不安全模式。
最容易被忽略的是证书有效期与签名算法兼容性:MongoDB 8.0+ 拒绝早于 2024-01-01 签发的 SHA-1 证书,且所有节点证书必须用相同 CA、相同签名算法(如 RSA-SHA256)签发,否则链式校验中断,集群无法形成。











