必须为每个mongod/mongos实例分配独立TLS证书,因主机名、网络角色不同,共用证书会导致SAN不匹配、连接拒绝、私钥泄露及信任链失效。

必须为每个 mongod/mongos 实例分配独立的 TLS 证书,不能复用同一份 tlsCertificateKeyFile。 否则会破坏主机名验证、增加私钥泄露风险,并在副本集或分片集群中引发连接拒绝或证书 SAN 不匹配错误。
为什么不能共用同一个证书文件
mongod 和 mongos 虽然都支持 TLS,但它们部署位置、主机名、网络角色完全不同。TLS 握手时客户端(如 mongosh 或驱动)会严格校验证书中的 Subject Alternative Name (SAN) 是否匹配实际连接的主机名(或 IP)。若多个实例共用一份证书,而该证书只包含某一台机器的 FQDN 或 IP,则其他节点的连接必然失败。
- 副本集成员间通信(如心跳、oplog 拉取)也会执行证书校验,共用证书会导致
SSLHandshakeFailed错误 - 私钥一旦在多台机器上部署,等于扩大了攻击面;任一节点失陷即导致整套 TLS 信任链失效
- Ops Manager 或 Cloud Manager 在 11.12.0.7384+ 版本强制要求证书含 SAN 字段,且每个主机必须有对应条目
生成与部署各自证书的关键步骤
核心原则:每台物理/虚拟机生成专属私钥 + 专属 CSR,由同一 CA 签发,但 SAN 中仅包含该主机的可解析域名或 IP。
- 使用
openssl req -newkey rsa:2048 -nodes -keyout mongod01.key -out mongod01.csr为每台 mongod 主机单独生成密钥和 CSR - 在签发证书时,确保
subjectAltName包含该主机的 FQDN(如DNS:mongod01.example.com)和/或内网 IP(如IP:192.168.1.10)——不要把所有节点的域名塞进同一个证书 - 将签发后的证书与私钥合并为 PEM 文件:
cat mongod01.crt mongod01.key > mongod01.pem,并设权限为600 - 对 mongos 实例重复上述流程,产出
mongos01.pem、mongos02.pem等独立文件
配置 mongod 与 mongos 的 tls 参数差异
两者启用 TLS 的参数名完全一致,但路径和内容必须指向各自证书文件,且 tlsMode 建议统一设为 requireTLS(强制加密)。
- mongod 配置示例(
/etc/mongod.conf):net:<br> tls:<br> mode: requireTLS<br> certificateKeyFile: /etc/ssl/mongod01.pem<br> CAFile: /etc/ssl/ca.pem
- mongos 配置示例(
/etc/mongos.conf):net:<br> tls:<br> mode: requireTLS<br> certificateKeyFile: /etc/ssl/mongos01.pem<br> CAFile: /etc/ssl/ca.pem
- 注意:
CAFile可共用(只要所有服务器证书均由同一 CA 签发),但certificateKeyFile绝对不可共享 - 若私钥已加密,需额外提供
tlsCertificateKeyFilePassword;FIPS 模式下还须确认私钥为 PKCS#8 格式(可用openssl pkcs8 -topk8转换)
常见报错与排查方向
连接失败时,先看服务端日志(journalctl -u mongod 或 mongod.log),再查客户端错误细节。
-
SSLHandshakeFailed: unable to get local issuer certificate→ 客户端未传--tlsCAFile,或所指 CA 文件不包含签发该服务器证书的根证书 -
SSLHandshakeFailed: Hostname/IP does not match certificate's altnames→ 证书 SAN 缺少当前连接的 host 或 IP,或客户端用 IP 连接但证书只写了 DNS 名 -
SSLHandshakeFailed: bad certificate→ 私钥与证书不匹配(可用openssl x509 -noout -modulus -in mongod01.pem | openssl md5和openssl rsa -noout -modulus -in mongod01.pem | openssl md5对比) - mongos 启动时报
Failed to load certificate key file→ 文件路径错误、权限不足(非600)、或格式非法(如含 Windows CRLF 换行)
最易被忽略的是:即使证书本身正确,如果 mongod/mongos 所在主机的系统时间偏差超过 5 分钟,TLS 握手也会因证书“未生效”或“已过期”而静默失败——务必同步 NTP。

















