证书过期错误99%与mongodb服务端无关,而是客户端环境根证书(ca)过旧,无法验证let’s encrypt新证书链;必须显式指定tlscafile=certifi.where(),仅安装certifi无效。

证书过期错误不是MongoDB服务端的问题
这个错误99%和你的 MongoDB 服务端证书无关,而是 Python、Navicat 或其他客户端运行环境信任的根证书(CA)太旧,无法验证 Let’s Encrypt 新签发的证书链。2024年9月 DST Root CA X3 已正式停用,但很多系统或 Python 安装仍依赖它。
必须显式传 tlsCAFile=certifi.where() 才生效
只 pip install certifi 不解决问题——PyMongo 默认仍走系统 CA 路径。你得在 MongoClient 初始化时明确指定:
from pymongo import MongoClient import certifi <p>client = MongoClient( "mongodb://user:pass@host:27017/admin", tls=True, tlsCAFile=certifi.where() # ← 这一行不能少 )</p>
-
ssl=True是过时写法,不推荐;tls=True才是 PyMongo 4.0+ 正确开关 - 用了
mongodb+srv://也不影响,SRV 解析后照样走 TLS 握手,tlsCAFile依然起作用 - 如果打包成可执行文件(PyInstaller/cx_Freeze),要确保
certifi.where()返回的路径在运行时可访问,否则需手动把cacert.pem打包进去并硬编码路径
系统级证书更新场景:certifi 失效时怎么办
以下情况 certifi.where() 会失效,必须更新系统 CA:
- Ubuntu/Debian 上通过
apt install python3-pymongo安装的 PyMongo,其 SSL 模块绑定的是/etc/ssl/certs/ca-certificates.crt→ 运行sudo update-ca-certificates - CentOS/RHEL →
sudo update-ca-trust - macOS(Homebrew Python)→
brew reinstall ca-certificates - Windows → 手动下载 ISRG Root X1 和 Let’s Encrypt R3 的
.cer文件,导入到“受信任的根证书颁发机构”
绝对不要用 ssl_cert_reqs=ssl.CERT_NONE
PyMongo 6.0+ 已彻底弃用该参数,强行加会直接报错:ValueError: ssl_cert_reqs cannot be CERT_NONE。临时调试可用 tlsAllowInvalidCertificates=True(仅限本地),但它只是跳过有效期和域名检查,TLS 加密仍在;上线前必须删掉——这个开关容易被遗忘,是生产环境最隐蔽的安全漏洞来源之一。











