MongoDB双向认证需同时配置net.tls.mode: requireTLS和net.tls.allowConnectionsWithoutCertificates: false,否则仅加密不校验客户端身份;clusterFile必须独立配置且含节点证书+私钥,CA文件须统一,客户端连接必须显式指定tlsCAFile。

必须同时配置 net.tls.mode: requireTLS 和 net.tls.allowConnectionsWithoutCertificates: false,否则看似启用了 TLS,实则客户端证书校验被跳过,根本不是双向认证。
为什么 sslMode: requireSSL 不等于双向认证
这个参数只强制走加密通道,不校验客户端身份。MongoDB 默认允许无证书连接,allowConnectionsWithoutCertificates 控制的就是这道门——它默认为 true,设成 false 才真正启用客户端证书强制校验。
- 只配
requireTLS时,db.runCommand({connectionStatus: 1})返回的authInfo.authenticatedUsers是空数组 - 日志里看不到错误,但攻击者只要能连上端口,就能发任意命令
- 副本集内部通信不受此参数影响,必须单独配
clusterFile
net.tls.clusterFile 是副本集 TLS 握手成败的关键
不配这个字段,从节点会卡在 STARTUP2,主节点状态仍显示 PRIMARY,但实际已分裂——这是最危险的“假正常”。
-
clusterFile必须是未加密 PEM 文件,内容为「该节点证书 + 该节点私钥」(顺序:证书在前,私钥在后) - 不能复用
certificateKeyFile路径,哪怕文件内容一样;语义不同,MongoDB 内部处理逻辑分离 - 所有节点的
net.tls.clusterCAFile必须和net.tls.CAFile指向**同一个**ca.crt,否则报unable to get local issuer certificate - 证书的
subjectAltName必须包含所有访问该节点的 DNS 名和 IP,用openssl x509 -in server.pem -text -noout | grep -A1 "Subject Alternative Name"确认
客户端连接必须显式带 --tlsCAFile,否则握手静默失败
只加 --tls 等于没开验证,默认跳过服务器证书检查,等同明文传输。
- 正确命令:
mongo --tls --tlsCAFile /path/to/ca.crt --tlsCertificateKeyFile /path/to/client.pem --host rs1.example.com - 连接字符串写法:
mongodb://rs1.example.com:27017/?tls=true&tlsCAFile=/path/to/ca.crt,仅tls=true不够 -
--tlsAllowInvalidCertificates和--tlsAllowInvalidHostnames绝对不可用于生产环境 - Node.js/Python/Java 驱动必须显式传入 CA 路径,且 Driver 版本需支持 TLS 1.2+(如 Java Driver 4.x)
最容易被忽略的是时间同步和权限控制:所有节点系统时间误差不能超过 5 分钟,否则报 clock skew detected;证书文件权限必须 ≤600,属主为 mongod 用户,否则启动直接失败,错误信息只是模糊的 Permission denied。











