必须统一启用requireSSL且共用同一CA证书,否则分片集群组件间静默拒绝连接;所有mongod/mongos需配置--sslMode requireSSL、相同--sslCAFile,并确保时间同步≤5分钟及驱动TLS参数匹配。

分片集群必须所有节点(mongos、shard、config server)统一启用 requireSSL,且共用同一套 CA 证书,否则组件间连接直接失败——不是报错,而是静默拒绝或超时。
所有 mongod/mongos 必须加 --sslMode requireSSL
分片集群内部通信默认明文,哪怕只给 mongos 配了 TLS,其他节点仍走非加密通道,导致握手中断。不能一个节点用 allowSSL,另一个用 requireSSL。
-
mongod启动参数必须包含:--sslMode requireSSL --sslPEMKeyFile /path/to/node.pem --sslCAFile /path/to/ca.crt -
mongos同样要加相同参数,--sslCAFile必须指向和 shard/config server 完全相同的 CA 文件 - 错误现象:日志里出现
SSL peer certificate validation failed: unable to get local issuer certificate,基本就是 CA 路径不一致或证书未被信任 - 别混用自签名 CA:config server 用 A-CA 签,shard 用 B-CA 签,集群可能部分通、部分不通,排查成本极高
客户端连接串里 tls=true 和 ssl=true 不可混用
驱动版本决定参数名,混用会导致连接成功但数据明文传输——表面正常,实则无加密。
- MongoDB Driver 4.0+ 推荐用
tls=true;3.x 及更老版本认ssl=true - Java 驱动若设
sslEnabled=true却没配sslInvalidHostNameAllowed=false,证书域名校验被跳过,看似连上实则无认证 - PyMongo 示例:
mongodb://user:pass@mongos.example.com:27017/?tls=true&tlsCAFile=/ca.crt—— 注意是tlsCAFile,不是ssl_ca_certs(旧版参数) - Node.js 驱动漏掉
tlsAllowInvalidHostnames: false,测试环境能连,上线后因证书 CN 与实际 host 不符而失败
x.509 认证和 keyfile 互斥,且用户必须提前创建
启用 TLS 后若想做内部组件认证,只能二选一:x.509 或 keyfile。二者同时存在,mongod 进程启动即退出,日志只提示模糊错误:can't use both keyFile and x.509。
- 选 x.509 前,必须先在
$external数据库创建用户,例如:db.getSiblingDB("$external").createUser({user: "CN=shard1,O=myorg", roles: [{role:"clusterAdmin", db:"admin"}]}) - 证书的
subject(如CN、O)必须和 createUser 时的user字段完全一致 - 所有节点时间偏差不能超过 5 分钟,否则 SSL 握手直接失败,错误常表现为
certificate has expired or is not yet valid,实际是系统时间不同步
最易忽略的是:CA 一致性、时间同步、驱动参数版本匹配——这三个点不出问题,TLS 才算真正生效;出问题时往往没有明确报错,而是连接卡住或随机断连。


















