不能靠db.rotatecertificates()单独实现零停机证书更新。它仅重载证书文件,不生成分发新证书、不重建客户端连接池,且要求证书原子替换、权限严格为600、路径完全匹配,滚动顺序须secondary→primary→secondary,并强制客户端主动重建连接池。

不能靠 db.rotateCertificates() 单独实现零停机证书更新。它只重载文件,不生成新证书、不分发、不触发客户端连接池重建——直接调用必然导致部分连接中断或握手失败。
证书文件必须原子替换且权限严格为600
mongod 对 certificateKeyFile、clusterFile、CAFile 等路径下的文件有强校验:文件存在、可读、权限必须是 600(UNIX)、内容格式合法。任何一项不满足,db.rotateCertificates() 会静默失败或报错 Failed to load TLS certificate。
- 推荐用
mv new.pem old.pem && mv tmp.pem new.pem方式原子覆盖,避免中间态文件缺失 - 替换后必须执行
chown mongod:mongod+chmod 600;容器内尤其注意 UID 可能不是 0 - 若用 Vault Agent 渲染,
destination路径需与 mongod 配置中路径完全一致(含大小写、末尾斜杠)
滚动更新顺序必须是 secondary → primary → secondary
副本集节点身份和心跳依赖 TLS 握手;主节点轮换过早,会导致从节点无法建立加密心跳连接,触发 replSetHeartbeat failed 和选举震荡。
- 先对所有
SECONDARY节点执行证书文件替换 +db.rotateCertificates() - 再对
PRIMARY执行:先运行rs.stepDown(),等新PRIMARY选出并稳定(建议wait 30s并确认rs.status().members[n].stateStr === "PRIMARY"),再操作 - 原
PRIMARY降级为SECONDARY后,最后对其轮换
客户端连接池必须主动重建
即使服务端证书已更新、mongod 已 reload,pymongo / node-mongodb-native 等驱动仍会复用旧 TLS 会话(session resumption),导致后续请求握手失败,错误常为 ssl.SSLError: [SSL: TLSV1_ALERT_UNKNOWN_CA] 或 connection closed by peer。
- pymongo 中必须调用
client.close()后新建client - Node.js 中需销毁旧
MongoClient实例,不可复用 - 无状态服务(如 API 网关)可滚动重启;有状态服务(如长连接 WebSocket 后端)需实现连接优雅关闭逻辑
- Kubernetes 下建议配合 readiness probe 检查
db.runCommand({ping:1})成功后再开放流量
extensionValue 和 SAN 字段最容易被忽略:当启用 net.tls.clusterAuthX509.extensionValue 时,mongod 会校验证书中指定 OID 扩展值是否完全匹配——哪怕多一个空格或发布时间字段(比如“2026年9月1日”)都会导致认证失败。











