必须统一启用requiressl且共用同一ca证书;keyfile与x.509互斥,混用导致进程退出;内部组件默认明文通信,全链路需一致配置--sslmode requiressl及严格匹配的证书subject、san和时间同步(≤30秒)。

必须统一启用 requireSSL,且所有节点共用同一 CA 证书;keyFile 和 x.509 互斥,不能混用——否则节点直接退出,日志只报 can't use both keyFile and x.509。
shard/config server/mongos 全部启用 requireSSL 才能通信
分片集群内部组件(shard ↔ config server ↔ mongos)默认走明文,哪怕只配了一个节点的 TLS,其他节点仍拒绝连接。这不是“部分生效”,而是全链路断裂。
- 所有
mongod(shard 和 config server)和mongos启动时都必须加--sslMode requireSSL,不能一个用allowSSL、另一个用requireSSL -
--sslCAFile必须指向**完全相同的 CA 证书文件**(字节级一致),不同 CA 签发的证书会导致握手失败,错误类似unable to get local issuer certificate - 配置项必须写在
net.tls下,YAML 缩进严格:net:下两级缩进写tls:,再两级写mode:等,错一级就静默失效
x.509 认证前必须创建对应用户,且证书属性要匹配
启用 x.509 后,节点间认证依赖证书中指定的组织属性(如 O、OU),不是“有证书就能连”。MongoDB 会逐字段比对,不匹配则卡在 STARTUP2。
- 先在
admin数据库执行db.getSiblingDB("$external").createUser(...),user字段必须与证书subject完全一致(例如CN=shard1,O=myorg,OU=db) - 所有节点的
net.tls.clusterAuthX509.attributes配置必须相同,比如都设为O=MongoDB, OU=Shard;顺序无关,但值必须全等 - 证书的
subjectAltName必须包含该节点所有可访问地址(DNS 或 IP),否则mongos连接时会报unable to verify the first certificate
时间同步误差超过 30 秒会导致 TLS 握手失败
错误日志只显示模糊的 SSL handshake failed,不提示时间问题。x.509 证书含有效期,系统时间偏差过大时,OpenSSL 直接拒绝握手。
- 所有节点必须运行 NTP 或 systemd-timesyncd,并确保时间误差 ≤ 30 秒;建议用
chrony并配置统一上游源 - 不要依赖本地时钟或手动
date设置——重启后失效,且无法保证集群内一致性 - 验证方式:在各节点执行
ntpq -p或timedatectl status,确认System clock synchronized: yes
别把 keyFile 和 x.509 混在一起试
一旦在配置里同时出现 security.keyFile 和 TLS 相关参数(如 net.tls.mode),进程启动即退出,日志只有 can't use both keyFile and x.509 ——没有堆栈、没有上下文,就是硬性拦截。
- 选
keyFile就彻底删掉所有net.tls.*配置;选x.509就必须清空security.keyFile,且security块下不能留空字段 -
mongos节点严禁出现security:块(哪怕为空),否则启动失败,日志只报Failed to load configuration from file - 测试阶段若想快速验证,可用
mkcert本地生成证书,但生产环境必须用统一 CA 签发,且禁用--sslAllowInvalidCertificates false和--sslAllowInvalidHostnames false
最容易被忽略的是:节点启动顺序和时间同步是隐性依赖,不报错、不提示,但会让整个集群卡在初始化阶段。配完证书和参数后,先跑 ntpq -p 和 openssl x509 -in /path/to/node.pem -text -noout | grep -A1 "Subject:",再启服务。











