繁体   English   中英

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

[英]PyMongo [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate

我正在使用 Python 3.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 package,但是文档的这一部分似乎只有在我使用 Python 2.x 时才有必要,但我不是。

所以,是的,我现在有点卡住了。

好吧,我最终决定安装certifi并且它起作用了。

client = MongoClient(CONNECTION_STRING, tlsCAFile=certifi.where())

希望文档对此更清楚一些,但也许我只是看起来不够努力。

在 Flask 服务器中,我使用以下方法解决了:

 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
import ssl

client = pymongo.MongoClient("mongodb+srv://<user>:<pass>@cluster0.nknw1.mongodb.net/<myFirstData?retryWrites=true&w=majority", ssl_cert_reqs= ssl.CERT_NONE)

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

 pip install certifi

可能是 Atlas 本身更新了其证书,也可能是您的操作系统上的某些内容发生了变化。 由于 OpenSSL 无权访问系统的根证书或证书已过期,因此经常出现“证书验证失败”。 有关如何排除故障,请参阅 TLS/SSL 和 PyMongo — PyMongo 3.12.0 文档 107。

所以试试:

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

这发生在 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",
        },
    }
}

但在主机中,您可能会遇到此问题:-“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"

添加

ssl=true&ssl_cert_reqs=CERT_NONE

在您的 url 字符串的数据库名称工作正常之后

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

我看到一个对我有用的答案,看来我还没有在我的 Mac 上安装 python 证书,所以我从以下路径开始安装它

/Applications/Python 3.10/Install Certificates.command

只更改您的 python 的版本,之后一切对我来说都很好

PS:解决了半天的问题,还问了ChatGPT

在此处输入图像描述

第1步:

pip install certifi

第2步:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM