3

我已经设置了一个测试 MongoDb Atlas 帐户,只是其中一个免费帐户,并在我的 Ubuntu 机器上使用以下代码,我可以成功创建用户并搜索他们。

当我在 MacBook Air 上尝试完全相同的操作时,我得到了如下所示的 SSL 握手。

pymongo.errors.ServerSelectionTimeoutError:SSL 握手失败:[SSL:CERTIFICATE_VERIFY_FAILED] 证书验证失败(_ssl.c:833),SSL 握手失败:[SSL:CERTIFICATE_VERIFY_FAILED] 证书验证失败(_ssl.c:833),SSL 握手失败: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:833)

import pymongo
client = pymongo.MongoClient("mongodb+srv://MYUSERNAME:MYPASSWORD@cluster0-ABCDEF.mongodb.net/test")
db = client.johnny
collection = db.myjohnnytest

example = {'name' : 'Johnny',
            'email' : 'johnny@test.net'}

user_id = collection.insert_one(example).inserted_id

我发现这个答案似乎是关键:

堆栈溢出答案

但是我已经尝试过了,无论我完全遵循它还是激活我的 virtualenv,我都会收到以下错误:

找不到激活的 virtualenv(必需)。回溯(最后一次调用):文件“”,第 44 行,在文件“”中,第 25 行,在主文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py” ,第 291 行,在 check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6', '-E', '-s' , '-m', 'pip', 'install', '--upgrade', 'certifi']' 返回非零退出状态 3. 注销 保存会话... ...复制共享历史记录... .. .保存历史...截断历史文件... ...完成。

4

3 回答 3

16

默认情况下,PyMongo 配置为在启用 TLS 时需要来自服务器的证书。这可以使用 ssl_cert_reqs 选项进行配置。要禁用此要求,请将 ssl.CERT_NONE 作为关键字参数传递:

>>> uri = 'mongodb://example.com/?ssl=true&ssl_cert_reqs=CERT_NONE'
>>> client = pymongo.MongoClient(uri)
于 2019-04-04T13:51:20.270 回答
1

您是否更新了 Python 的 CA 包?

从 bash shell/终端:打开“/Applications/Python 3.6/Install Certificates.command”

或 Python 3.7 等

关于 MacOS、Python 和 CA 的 Python Stackoverflow 文章的MongoDB 文档

于 2019-01-13T06:20:05.123 回答
0

我展示了两种解决方法:

  1. (最简单的)

添加...&ssl=true&ssl_ca_certs=/path/to/cert.pem到mongodb url

  1. (推荐的)

配置 python SSL 连接。

$ python3 -c "import ssl; print(ssl.get_default_verify_paths())
DefaultVerifyPaths(cafile='/Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/certs')

然后确保将cert.pem文件添加到指定路径。就我而言,我应该将其添加到文件夹中/Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/

于 2018-08-13T14:07:20.423 回答