![](/img/trans.png)
[英]Python tcp socket with ssl encryption [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)
[英]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"
第1步:
pip install certifi
第2步:
client = pymongo.MongoClient(connection, tlsCAFile=certifi.where())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.