我使用的是Python3.9.5和PyMongo 3.11.4。我的MongoDB数据库的版本是4.4.6。我使用的是Windows 8.1
我正在学习MongoDB,我在Atlas中设置了一个我连接的集群。每当我尝试将文档插入到集合中时,都会引发ServerSelectionTimeoutError
,并且在它的圆括号中有几个[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
。
排除PyMongo文档中的TLS错误并没有太大帮助,因为它们只为Linux和MacOS用户提供提示。
值得一提的是,如果我在初始化MongoClient
时设置了tlsAllowInvalidCertificates=True
,一切都会正常工作。这听起来很不安全,虽然我正在做一个小项目,但我仍然希望养成良好的习惯,不会凌驾于任何现有的安全措施之上,所以我希望有替代方案。
从我所做的所有搜索来看,我猜我错过了某些证书,或者是Python找不到它们。我研究了certifi
包,但文档的这一部分似乎只有在我使用的是Python2.x时才有必要这样做,而实际上我没有。
所以,是的,我现在有点被困住了。
5条答案
按热度按时间6mzjoqzu1#
嗯,我最终决定安装
certifi
,它起作用了。client = MongoClient(CONNECTION_STRING, tlsCAFile=certifi.where())
我希望医生能把这一点说清楚,但也许我看得还不够认真。
htzpubme2#
在我通过使用以下方法解决的FlaskServer中:
zzoitvuj3#
默认情况下,pymongo依赖于操作系统的根证书。您需要安装
certifi
:这可能是Atlas本身更新了它的证书,也可能是您操作系统上的某些东西发生了变化。“证书验证失败”经常发生,因为OpenSSL无权访问系统的根证书或证书已过期。有关如何进行故障排除的信息,请参阅TLS/SSL和PyMongo-PyMongo 3.12.0文档107。
所以试一试吧:
hpxqektj4#
在Django中也会发生这种情况,只需将上面的代码添加到Django中的
settings.py
:但在HOST中,您可能会收到以下问题:
“pymongo.errors.ServerSelectionTimeoutError:”[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地颁发者证书(_ssl.c:997)
因此,您可以添加以下内容:
ktca8awb5#
增列
在db名称之后,您的url字符串工作正常