必须用ca签发的证书,自签名证书在生产环境无法真正防中间人攻击;mongodb副本集启用net.tls.clusterauthx509后,所有节点证书的o和ou字段必须完全一致,cafile需能链到各节点证书签发者,且配置必须使用tls而非已弃用的ssl键名,路径权限须为≤600,客户端连接必须显式指定--tlscafile等参数以强制校验。

必须用 CA 签发的证书,自签名证书在生产环境无法真正防中间人攻击。
生成符合 MongoDB 要求的证书时,组织单位(OU)必须一致
MongoDB 副本集或分片集群启用 net.tls.clusterAuthX509 后,所有节点证书的 O(组织)、OU(组织单位)字段必须完全相同,否则节点间握手失败,报错类似 SSL handshake failed: certificate verification failed。
- 生成 CSR 时,
openssl req -new过程中填的Organizational Unit Name必须统一,比如都填MongoDB Server - 如果用了多个 OU(如
OU=Infra, OU=DBA),所有节点证书必须包含完全相同的 OU 列表、相同顺序 - CAFile 指向的根证书必须能链到每个节点证书的签发者,不能只放中间 CA
- 证书有效期建议 ≥2 年,但 MongoDB 8.0+ 默认拒绝早于 2024-01-01 签发的 SHA-1 证书
mongod.conf 中 tls 配置项不能混用旧版 ssl 键名
MongoDB 4.2+ 已弃用 ssl 键名,改用 tls;若配置里还写 ssl: mode: requireSSL,服务启动时会静默忽略 TLS 设置,日志里也不报错,但实际未加密——这是最隐蔽的安全漏洞。
- 正确写法是:
net: tls: mode: requireTLS certificateKeyFile: /etc/ssl/mongodb.pem CAFile: /etc/ssl/ca.pem -
allowConnectionsWithoutCertificates: false必须显式设置,否则客户端可绕过证书验证 -
clusterFile和certificateKeyFile不能指向同一文件;集群内认证需独立clusterFile,且其证书的subjectAltName必须包含节点 hostname 或 IP - Linux 下路径权限必须严格:证书文件属主为
mongod用户,权限 ≤600,否则启动失败并报Permission denied
mongo shell 连接时 --tls 参数组合容易漏掉关键项
只加 --tls 不等于启用证书校验;默认行为是跳过服务器证书验证,等同于明文传输——这在测试环境常见,但上线即高危。
- 生产连接必须带:
mongo --tls --tlsCertificateKeyFile /path/client.pem --tlsCAFile /path/ca.pem --host rs1.example.com -
--tlsAllowInvalidCertificates和--tlsAllowInvalidHostnames绝对不可出现在生产命令中 - 若用连接字符串,
mongodb://后必须加?tls=true&tlsCAFile=/path/ca.pem,仅tls=true不够 - mongo shell 7.0+ 默认启用
tlsInsecure为 false,但旧版本(如 4.4)需手动关掉不安全选项
OpenSSL 版本与密码套件兼容性常被忽略
MongoDB 6.0.7+ 和 7.0+ 默认禁用 TLS 1.0/1.1,且强制要求前向保密(PFS)套件;若 OpenSSL 库太旧或配置不当,连接会直接中断,错误信息往往只显示 connection refused 或空超时。
- Ubuntu 22.04+/RHEL 9+ 自带 OpenSSL 3.0,支持 ECDHE-SHA256 等现代套件;旧系统(如 CentOS 7)需升级 OpenSSL 至 1.1.1k+
- 可通过
openssl ciphers -v 'DEFAULT@SECLEVEL=2'查看 MongoDB 实际加载的可用套件 - 若用自建 CA,确保其私钥使用 RSA 2048+ 或 EC P-256,MD5/SHA1 签名的 CA 会被 MongoDB 8.0+ 拒绝
- 证书中
subjectAltName必须包含实际访问的 hostname 或 IP,DNS 条目不匹配会导致certificate verify failed: IP address mismatch
真正防中间人攻击的核心不在“配了 TLS”,而在证书链可信、节点身份可验证、且所有通信路径(客户端→server、server↔server)全部强制校验。少一个环节,就等于没配。











