mongodb启用tls客户端证书认证需同时满足sslcafile仅含公司根ca证书且配置sslclientcertificaterequired: true,否则无法实现仅信任指定ca的客户端认证。

配置MongoDB启用TLS客户端证书认证
MongoDB 本身不支持“仅信任某一个自签CA”这种粒度的硬性限制,它只校验客户端证书是否由 sslCAFile 指定的 CA 证书链签发。所以关键不是“怎么限定唯一CA”,而是“确保 sslCAFile 里只放你公司的根CA(且不混入其他CA)”。否则哪怕证书是自签的,只要能被链上任意一个CA验证,MongoDB 就会放行。
准备公司自签CA和客户端证书
必须用 OpenSSL 或 cfssl 等工具生成标准 X.509 证书,不能用自动生成的 PEM 拼接体。常见错误是把 root CA、intermediate CA、client cert 全塞进一个文件,导致 MongoDB 启动失败或校验失效。
-
sslCAFile只应包含你公司根CA证书(PEM格式),不含私钥,也不含中间证书(除非你明确需要链式验证) - 客户端证书需用该CA签名,且
subjectAltName或commonName需匹配sslAllowConnectionsWithoutCertificates=false下的用户名映射规则 - 客户端私钥必须未加密(或启动时用
sslPEMKeyPassword提供密码),否则mongod无法加载
mongod.conf 中的关键TLS配置项
仅开启 sslMode: requireSSL 不够,必须组合使用证书校验开关,否则客户端可跳过证书提交。
-
sslMode: requireSSL—— 强制所有连接走 TLS -
sslPEMKeyFile: /etc/mongo/server.pem—— 服务端证书+私钥(PEM拼接,私钥无密码) -
sslCAFile: /etc/mongo/company-root-ca.pem—— 仅你公司根CA,不能是 bundle -
sslClientCertificateRequired: true—— 关键!拒绝无证书的 TLS 连接 - (可选)
sslAllowConnectionsWithoutCertificates: false—— 与上一条逻辑重复,但显式关闭更稳妥
如果漏掉 sslClientCertificateRequired: true,即使配了 sslCAFile,客户端仍可建立 TLS 连接但不发证书,MongoDB 默认接受——这等于没开客户端认证。
验证是否真只认你家CA
最容易被忽略的是:MongoDB 不报错 ≠ 认证生效。得用真实客户端测试,不能只看 mongod 启动日志。
- 用另一个非你公司CA签发的客户端证书连接:
mongo --host x --ssl --sslCAFile other-ca.pem --sslPEMKeyFile bad-client.pem,应返回SSL handshake failed: ... certificate verify failed - 用正确证书但故意改
sslCAFile指向空文件或错误路径,mongod启动会直接失败,报error: couldn't initialize SSL - 用正确证书 + 正确CA,但去掉
sslClientCertificateRequired: true,连接成功但db.runCommand({connectionStatus: 1})的authInfo里authenticatedUsers为空——说明证书没被校验
真正起作用的是「CA文件内容」+「sslClientCertificateRequired」两个条件同时满足;少一个,你的“仅信任公司CA”就形同虚设。










