必须启用tls.enabled: true并显式指定CA证书路径,否则连接会因证书验证失败而拒绝;security.tls.ca需填入挂载的CA证书文件名,additionalMongodConfig.net.ssl.mode推荐设为"requireTLS",所有成员须使用同一CA签发且属性一致的证书。

必须启用 tls.enabled: true 并显式指定 CA 证书路径,否则连接会因证书验证失败而拒绝,哪怕 MongoDB 服务端已开启 TLS。
副本集 Kubernetes Operator 配置 TLS 的关键字段
使用 MongoDB Kubernetes Operator 部署副本集时,TLS 不是默认开启的,也不能仅靠服务端配置生效。客户端连接和节点间通信都依赖 Operator YAML 中的 security.tls 块。
-
security.tls.enabled: true是强制开关,缺省为false -
security.tls.ca必须填入 ConfigMap 或 Secret 中挂载的 CA 证书文件名(如ca.pem),不能留空或设为占位符 -
additionalMongodConfig.net.ssl.mode推荐设为"requireTLS";若设为"preferSSL",未加密连接仍可能被接受,存在中间人风险 - 所有副本集成员必须挂载相同的 CA 证书,且证书内容完全一致——Operator 不做内容校验,但 mongod 启动时会因证书不匹配而崩溃
连接字符串里 tls=true 不足以完成验证
即使服务端启用了 TLS,客户端仅加 ?tls=true 仍大概率报错 unable to verify the first certificate。因为 Node.js、Python PyMongo、PHP 等驱动默认启用证书验证,但不会自动加载系统 CA 或任意 PEM 文件。
- PHP 驱动需额外传
tlsCAFile参数,例如:"mongodb://rs1.example.com:27017/?tls=true&tlsCAFile=/path/to/ca.pem" - Python PyMongo 要显式指定
tlsCAFile和tlsCertificateKeyFile(如需双向认证) - Rust 驱动需构造
TlsOptions结构体并传入ca_file字段,不能只靠 URI 参数 - 注意:若连接字符串含
mongodb+srv://前缀,则tls=true自动生效,但仍需提供 CA 文件路径,否则验证失败
证书属性匹配失败导致副本集无法选举
启用 TLS 后,副本集成员之间用 X.509 证书相互认证。若证书中 O(Organization)、OU(Organizational Unit)等字段不一致,节点将拒绝握手,表现为 SSL handshake failed 或日志中反复出现 no certificate presented。
- 所有成员证书必须使用同一 CA 签发,且
net.tls.clusterAuthX509.attributes在配置中显式声明相同值,例如:O=MongoDB, OU=ReplicaSet - 不能混用自签名证书与公信 CA 证书——哪怕都是 PEM 格式,mongod 会因信任链断裂拒绝加入集群
- 证书有效期必须覆盖整个部署生命周期;过期后节点无法重连,且不会提示“证书过期”,只显示 TLS 握手超时
最容易被忽略的是:Operator 部署时若未提前创建含 CA 证书的 Secret,或挂载路径与 security.tls.ca 值不匹配,mongod 容器会静默失败——Pod 状态可能是 Running,但日志里早已输出 Failed to load TLS certificate,而副本集始终处于 STARTUP2 状态无法完成初始化。

















