18

尝试连接到 Azure CosmosDB mongo 服务器会导致 SSL 握手错误。

我正在使用Python3Pymongo连接到我的 Azure CosmosDB。如果我使用 Python27 运行代码,则连接工作正常,但在使用 Python3 时会导致以下错误:

import pymongo
from pymongo import MongoClient
import json
import sys

def check_server_status(client, data):
   '''check the server status of the connected endpoint'''
   db = client.result_DB
   server_status = db.command('serverStatus')
   print('Database server status:')
   print(json.dumps(server_status, sort_keys=False, indent=2, separators=(',', ': ')))
   coll = db.file_result
   print (coll)
   coll.insert_one(data)

def main():
    uri = "mongodb://KEY123@backend.documents.azure.com:10255/?ssl=true&replicaSet=globaldb"
    client = pymongo.MongoClient(uri)
    emp_rec1 = {
        "name":"Mr.Geek",
        "eid":24,
        "location":"delhi"
        }
    check_server_status(client, emp_rec1)

if __name__ == "__main__":
    main()

运行它Python3会导致以下错误:

pymongo.errors.ServerSelectionTimeoutError: SSL 握手失败: backendstore.documents.azure.com:10255: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:749)

这是我运行相同代码时的成功输出Python27

数据库服务器状态: { "_t": "OKMongoResponse", "ok": 1 } Collection(Database(MongoClient(host=['backend.documents.azure.com:10255'], document_class=dict, tz_aware=False, connect =True, ssl=True, replicaset='globaldb'), u'result_DB'), u'file_result')

4

8 回答 8

18

通过此更改解决了问题:

client = pymongo.MongoClient(uri, ssl_cert_reqs=ssl.CERT_NONE)
于 2019-02-05T21:11:48.183 回答
13

在 Windows 上你可以这样做

pip 安装证书

然后在代码中使用它:

import certifi
ca = certifi.where()

client = pymongo.MongoClient(
f"mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/xyzdb?retryWrites=true&w=majority", tlsCAFile=ca)
于 2021-07-06T08:06:10.063 回答
11

PyMongoTroubleshooting TLS Errors官方文档`TLS/SSL 和 PyMongo 的部分介绍了以下问题。

TLS 错误通常分为两类,证书验证失败或协议版本不匹配。类似于以下的错误消息意味着 OpenSSL 无法验证服务器的证书:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

这通常是因为 OpenSSL 无权访问系统的根证书或证书已过期。Linux 用户应确保从其 Linux 供应商处安装了最新的根证书更新。使用从 python.org 下载的 Python 3.6.0 或更新版本的 macOS 用户可能必须运行 python 附带的脚本来安装根证书:

open "/Applications/Python <YOUR PYTHON VERSION>/Install Certificates.command"

旧的 PyPy 和 PyPy3 便携版本的用户可能必须设置一个环境变量来告诉 OpenSSL 在哪里可以找到根证书。使用 pypi 的certifi 模块很容易做到这一点:

$ pypy -m pip install certifi
$ export SSL_CERT_FILE=$(pypy -c "import certifi; print(certifi.where())")

您可以尝试按照上面的描述来解决您的问题,这似乎是针对 Linux 和 Mac 用户的。在 Windows 上,我无法在 Python3.73.6. 如果您有任何疑虑,请随时告诉我。

于 2019-02-04T07:26:28.957 回答
6

尝试从 Digital Ocean 连接 mongodb 时遇到同样的问题,通过在 MongoClient 中使用此函数和参数解决:

def get_client(host,port,username,password,db):
      return MongoClient('mongodb://{}:{}/'.format(host,port),
                         username=username,
                         password=password,
                         authSource=db,
                         ssl=True,ssl_cert_reqs=ssl.CERT_NONE)

client = get_client("host-ip","port","username","password","db-name")
于 2019-06-12T08:06:34.603 回答
4

在 Mac Mojave 10.14.6 上,我使用(PyMongo 3.10 和 python 3.7)来解决:

烧瓶 pymongo pymongo.errors.ServerSelectionTimeoutError [SSL: CERTIFICATE_VERIFY_FAILED]

在终端执行:

sudo /Applications/Python\ 3.7/Install\ Certificates.command

如果您使用其他 python 版本,只需更改版本号(在我的情况下,我有 Python 3.7)

于 2020-05-01T01:19:36.590 回答
2
cluster = MongoClient(
    "url",
    ssl=True,
    ssl_cert_reqs=ssl.CERT_NONE,
)
于 2021-08-24T21:32:29.127 回答
0

更新@abhinav singh 提供的答案(截至 2022 年 1 月):

client = pymongo.MongoClient(uri, tls=True, tlsAllowInvalidCertificates=True)

参考:https ://pymongo.readthedocs.io/en/stable/examples/tls.html?#certificate-verification-policy

于 2022-01-05T17:38:53.483 回答
0

在 mac Monterey 上,我使用了 pymongo 3.12.1 和虚拟环境

要解决,请使用

ssl_cert_reqs=CERT_NONE

带有 mongodb 网址

于 2021-11-10T15:38:58.763 回答