分片集群TLS必须全组件统一启用requireSSL且CA一致,否则通信失败;x.509认证需提前创建用户并严格匹配subject;keyfile与x.509互斥;时间不同步超5分钟亦致SSL握手失败。

shard、config server、mongos 之间必须用 --sslMode requireSSL
分片集群内部组件通信(shard ↔ config server ↔ mongos)默认不加密,哪怕你只给 mongos 配了 TLS,其他节点仍走明文——这会直接导致连接拒绝或静默失败。关键不是“能不能配”,而是“必须统一配”。
实操建议:
-
mongod启动时加--sslMode requireSSL --sslPEMKeyFile /path/to/node.pem --sslCAFile /path/to/ca.crt,mongos同理;config server 和 shard 节点参数完全一致,不能一个用allowSSL、另一个用requireSSL - 所有节点的
--sslCAFile必须指向同一个 CA 证书,否则握手失败,错误信息类似:SSL peer certificate validation failed: unable to get local issuer certificate - 别用自签名证书混搭:比如 config server 用 A-CA 签,shard 用 B-CA 签——集群启动后可能部分连接通、部分不通,排查极难
客户端连 mongos 时,ssl=true 和 tls=true 的区别很实际
不同驱动对 TLS 参数命名不一致,但本质都是告诉驱动“走加密通道”。老版本 MongoDB Driver(如 3.x)认 ssl=true,新版本(4.0+)推荐用 tls=true;混用会导致连接成功但数据明文传输。
常见错误现象:
- Java 驱动用
sslEnabled=true却没设sslInvalidHostNameAllowed=false,结果连上但证书域名校验跳过,看似正常实则无认证 - Python PyMongo 连接串写成
mongodb://user:pass@host:27017/?ssl=true&ssl_ca_certs=/ca.crt,但服务端强制校验主机名,而证书 CN 是mongos.internal,客户端填的是mongos.example.com→ 报错:Certificate subject does not match hostname - Node.js 驱动若漏掉
tlsAllowInvalidHostnames: false,在测试环境容易忽略证书域名问题,上线后突然连不上
keyfile 认证和 x.509 认证不能共存,且 x.509 必须提前注入用户
分片集群启用 TLS 后,内部组件认证有两种路径:传统 keyfile(共享密钥)或基于证书的 x.509。二者互斥——选了 x.509 就不能再启 --keyFile,否则进程直接退出,日志里只有模糊提示:can't use both keyFile and x.509。
实操要点:
- 用 x.509 前,必须先在
admin数据库创建对应证书的用户,例如:db.getSiblingDB("$external").createUser({user: "CN=shard1,O=myorg", roles: [{role:"clusterAdmin", db:"admin"}]});没这步,shard 启动就卡住,日志反复刷Unable to authenticate using x.509 - 证书的
subject字段要严格匹配 createUser 时写的user值,大小写、空格、逗号顺序都影响匹配 -
keyfile方式更轻量,但密钥文件必须 600 权限、所有节点内容一致;稍有偏差,config server 就拒绝 shard 注册
mongos 日志里出现 SSL handshake failed 通常不是证书问题,而是时间不同步
证书有效期检查依赖系统时间,集群节点间时间差 > 5 分钟就会触发握手失败。这个坑特别隐蔽:证书本身有效、路径正确、CA 匹配,但就是连不上,日志只显示笼统的 SSL handshake failed,没有更细线索。
排查建议:
- 所有节点跑一次
ntpq -p或chronyc tracking,确认 offset date 命令输出,NTP 同步状态才是关键 - 别在 Docker 容器里直接挂宿主机
/etc/localtime——容器时区可能和证书签发时区不一致,尤其跨地域部署时 - 如果用了 Kubernetes,确保
hostNetwork: true或配置了可靠的 NTP sidecar,否则 Pod 时间漂移极快
证书链、密码套件、OCSP 这些高级配置,在大多数企业环境里反而不是第一阻力点;真正卡住人的,往往是节点间信任链没对齐、时间没同步、或者驱动参数和服务器模式没咬合上。










