Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3上Pymongo的SSL握手问题_Python_Python 3.x_Azure_Ssl_Azure Cosmosdb Mongoapi - Fatal编程技术网

Python3上Pymongo的SSL握手问题

Python3上Pymongo的SSL握手问题,python,python-3.x,azure,ssl,azure-cosmosdb-mongoapi,Python,Python 3.x,Azure,Ssl,Azure Cosmosdb Mongoapi,尝试连接到Azure CosmosDB mongo服务器会导致SSL握手错误 我正在使用Python3和Pymongo连接到我的Azure CosmosDB。如果我使用Python27运行代码,连接工作正常,但在使用Python3时会导致以下错误: import pymongo from pymongo import MongoClient import json import sys def check_server_status(client, data): '''check the

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

我正在使用
Python3
Pymongo
连接到我的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: 证书\u验证\u失败]证书验证失败(\u ssl.c:749)

以下是我在使用
Python27
运行相同代码时的成功输出:

数据库服务器状态:{“\t”:“OKMongoResponse”,“ok”:1} 集合(数据库(MongoClient(主机=['backend.documents.azure.com:10255']), document\u class=dict,tz\u aware=False,connect=True,ssl=True, replicaset='globaldb')、u'result\u DB')、u'file\u result')

PyMongo官方文档“TLS/SSL和PyMongo”一节介绍了以下问题

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

[SSL:CERTIFICATE\u VERIFY\u FAILED]CERTIFICATE VERIFY FAILED

这通常是因为OpenSSL无法访问系统的根证书或证书已过期。Linux用户应确保已从其Linux供应商处安装最新的根证书更新。使用Python 3.6.0或更新版本的macOS用户可从Python.org下载以安装根证书:

open”/Applications/Python/Install Certificates.command“

较旧的PyPy和Py3可移植版本的用户可能必须告诉OpenSSL在哪里可以找到根证书。使用来自pypi的:

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

您可以尝试按照上面的描述来解决您的问题,这似乎适用于Linux和Mac用户。在Windows上,我无法用Python
3.7
3.6
重现您的问题。如果您有任何问题,请随时通知我。

解决了此更改的问题:

client = pymongo.MongoClient(uri, ssl_cert_reqs=ssl.CERT_NONE)

在尝试从数字海洋连接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")

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

flask pymongo pymongo.errors.ServerSelectionTimeoutError[SSL:证书\u验证\u失败]

在终端中执行:

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

如果您使用其他python版本,只需更改版本号(在我的例子中,我使用的是python 3.7)

这是否意味着它不使用TLS握手?这似乎不是生产中最好的想法。这对于测试来说是好的,也许在开发场景中,当你知道你连接到什么的时候。然而,这不是我所说的解决方案。