滚动更新 MongoDB TLS 证书可实现零中断,前提是分三步切换认证模式:先启用 tlsClusterAuthX509Override 兼容旧证书,再替换 clusterFile 并更新 extensionValue,最后逐节点重启验证;必须禁用 requireTLS、避免硬重启,并在全量生效后清理覆盖参数与旧证书文件。

滚动更新 MongoDB TLS 证书可以做到零连接中断,但前提是必须分阶段切换认证方式,并严格控制 clusterAuthMode 和 tlsMode 的组合状态。硬重启或一次性全量替换证书必然导致节点失联。
先确认当前集群认证模式和 TLS 模式
运行以下命令检查每个节点的实际配置,不要只看配置文件:
db.adminCommand({ getCmdLineOpts: 1 })
重点关注两个字段:
-
net.tls.mode:必须是allowTLS或preferTLS才能滚动更新;若已是requireTLS,需先回退到preferTLS(通过setParameter) -
security.clusterAuthMode:若为keyFile,需先升级到sendKeyFile,再过渡到sendX509;若已是x509,则看是否用了attributes还是extensionValue
证书轮换必须分三步走,不能跳过中间态
核心逻辑是让新旧证书在一段时间内共存,靠配置参数控制匹配优先级。常见错误是直接删掉旧 clusterFile 或改 extensionValue 后立刻重启——这会立即拒绝旧证书连接,引发选举失败。
- 第一步:保留旧证书路径(如
/etc/mycerts/10gen-cluster1.pem),在配置中新增tlsClusterAuthX509Override,值设为旧证书的 DN 字符串(例如O=MongoDB,OU=MongoDB Server) - 第二步:把新证书(含新
extensionValue)放进clusterFile指向的路径,同时将clusterAuthX509.extensionValue设为新值(如mongodb://example.mongodb.net) - 第三步:逐个重启节点,每次只动一个;等该节点
rs.status()显示stateStr: "PRIMARY"或稳定为"SECONDARY"后再操作下一个
验证新证书生效且旧证书仍被接受
更新完一个节点后,立刻检查日志和连接行为,别等全部换完才排查:
- 查日志关键词:
Successfully validated X.509 certificate(说明新证书加载成功),Using tlsClusterAuthX509Override to accept legacy DN(说明覆盖机制生效) - 用
openssl s_client -connect host:27017 -tls1_2 -showcerts抓取实际返回的证书,比对 Subject 和 Extension 是否与新证书一致 - 临时起一个只带旧证书的
mongod实例,尝试连入集群——应能成功握手,证明tlsClusterAuthX509Override生效
最后清理阶段最容易出错
所有节点都运行新证书至少 24 小时、且 rs.status() 全部健康后,才能执行清理。此时漏掉任一环节都会导致后续无法降级或排障困难:
- 必须先移除
tlsClusterAuthX509Override参数,再重启节点;不能靠setParameter动态删,它不支持运行时删除该参数 - 删掉旧证书文件前,确认所有节点配置里已无任何对它的引用(包括
CAFile、clusterCAFile等) - 如果曾用
sendKeyFile过渡,现在要确保security.clusterAuthMode已设为x509,且配置文件中已删除keyFile行——否则重启后可能因权限问题卡在启动阶段











