PyMongo[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地颁发者证书

lokaqttq  于 2022-10-22  发布在  Go
关注(0)|答案(5)|浏览(277)

我使用的是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时才有必要这样做,而实际上我没有。
所以,是的,我现在有点被困住了。

6mzjoqzu

6mzjoqzu1#

嗯,我最终决定安装certifi,它起作用了。
client = MongoClient(CONNECTION_STRING, tlsCAFile=certifi.where())
我希望医生能把这一点说清楚,但也许我看得还不够认真。

htzpubme

htzpubme2#

在我通过使用以下方法解决的FlaskServer中:

import certifi

app = Flask(__name__)
app.config['MONGO_URI'] = 
'mongodb+srv://NAME:<PWD><DBNAME>.9xxxx.mongodb.net/<db>? retryWrites=true&w=majority' 
mongo = PyMongo(app,tlsCAFile=certifi.where())
collection_name = mongo.db.collection_name
zzoitvuj

zzoitvuj3#

默认情况下,pymongo依赖于操作系统的根证书。您需要安装certifi

pip install certifi

这可能是Atlas本身更新了它的证书,也可能是您操作系统上的某些东西发生了变化。“证书验证失败”经常发生,因为OpenSSL无权访问系统的根证书或证书已过期。有关如何进行故障排除的信息,请参阅TLS/SSL和PyMongo-PyMongo 3.12.0文档107。
所以试一试吧:

client = pymongo.MongoClient(connection, tlsCAFile=certifi.where())
hpxqektj

hpxqektj4#

在Django中也会发生这种情况,只需将上面的代码添加到Django中的settings.py

DATABASE = {
'default': {
'ENGINE': 'djongo',
 "CLIENT": {
           "name": <your_database_name>,
           "host": <your_connection_string>,
           "username": <your_database_username>,
           "password": <your_database_password>,
           "authMechanism": "SCRAM-SHA-1",
        },
    }
}

但在HOST中,您可能会收到以下问题:
“pymongo.errors.ServerSelectionTimeoutError:”[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地颁发者证书(_ssl.c:997)
因此,您可以添加以下内容:

"mongodb+srv://sampleUser:samplePassword@cluster0-gbdot.mongodb.net/sampleDB??ssl=true&ssl_cert_reqs=CERT_NONE&retryWrites=true&w=majority"
ktca8awb

ktca8awb5#

增列

ssl=true&ssl_cert_reqs=CERT_NONE

在db名称之后,您的url字符串工作正常

"mongodb+srv://username:Password@cluster0-gbdot.mongodb.net/DbName?**ssl=true&ssl_cert_reqs=CERT_NONE**&retryWrites=true&w=majority"

相关问题