必须显式设置tls=True且服务端已启用TLS监听,否则连接为明文并被断开;PyMongo 4.0+不支持ssl=True(静默忽略),自签名证书需配tlsCAFile,Atlas等云服务须用其官方ca.pem。

MongoClient 必须显式启用 tls=True,且服务端已开启 TLS 监听;否则即使客户端传了参数,连接仍是明文,还会被服务端主动断开。
PyMongo 4.0+ 必须用 tls= 而不是 ssl=
旧版驱动用 ssl=True,但 PyMongo 4.0+ 已统一为 tls 参数名。ssl=True 不会报错,但会被静默忽略——连接看似成功,实则走明文,服务端日志里会出现 connection ended 或 SSL handshake failed。
- 正确写法:
MongoClient("mongodb://localhost:27017/", tls=True) - 错误写法:
MongoClient("mongodb://localhost:27017/", ssl=True)(无效) - 混用更危险:
ssl=True, tls=True会触发警告,行为不可靠 - URI 中带
?ssl=true也无效——PyMongo 4.x 不解析该 query 参数
自签名证书必须配 tlsCAFile,不能只靠系统信任库
服务端用自签证书时,PyMongo 默认不信任它,必须通过 tlsCAFile 显式指定根证书路径。这个文件是 CA 的公钥(ca.pem),不是服务端的 mongodb.pem,也不是客户端证书。
-
tlsCAFile值必须是本地可读的绝对或相对路径,不能是 URL - 可用
certifi.where()替代手动管理(需先pip install certifi) - 若证书 SAN 缺失或不匹配(比如只写了
CN=localhost,没加DNS:localhost,IP:127.0.0.1),连接会卡在主机名校验,错误类似CertificateError: hostname 'localhost' doesn't match... - 开发临时绕过可用
tlsAllowInvalidHostnames=True,但生产环境绝不能设
Atlas 等云服务必须下载官方 ca.pem,不能复用系统证书
MongoDB Atlas 强制 TLS,且其证书链依赖自有根 CA。系统自带的 CA 库(如 Ubuntu 的 /etc/ssl/certs/ca-certificates.crt)通常不含 Atlas 的根证书,直接用会报 ssl.SSLError: certificate verify failed。
- 必须从 Atlas 控制台「Database > Connect > Drivers」页下载
ca.pem,保存到项目目录(如./certs/ca.pem) - 连接时传入:
tlsCAFile="./certs/ca.pem" - 路径权限要检查:Python 进程得有读权限,Windows 用户注意
~不展开,要用绝对路径 - 别把
tlsCAFile和tlsCertificateKeyFile搞混——后者是客户端双向认证才需要,Atlas 不要求
服务端没开 TLS,客户端再怎么配都白搭
PyMongo 开启 tls=True 只是告诉驱动“我要走加密通道”,但最终能否连上,取决于 mongod 是否监听 TLS 端口并接受加密握手。如果服务端配置漏了或错了,客户端所有参数都是摆设。
立即学习“Python免费学习笔记(深入)”;
- 确认
mongod.conf含完整 TLS 配置:net.tls.mode: requireTLS+net.tls.certificateKeyFile: /path/to/mongodb.pem -
mongodb.pem必须同时含私钥和证书(cat key.pem cert.pem > mongodb.pem),缺一不可 - 重启后检查日志是否有
Listening for TLS connections on port - 用
mongosh --tls --tlsCAFile ./ca.pem "mongodb://localhost:27017/"手动验证服务端是否就绪
tls=True 就只是个无效开关。


















