Python3上Pymongo的SSL握手问题
尝试连接到Azure CosmosDB mongo服务器会导致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
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握手?这似乎不是生产中最好的想法。这对于测试来说是好的,也许在开发场景中,当你知道你连接到什么的时候。然而,这不是我所说的解决方案。