Проблема рукопожатия SSL с Pymongo на Python3 - PullRequest
0 голосов
/ 01 февраля 2019

Попытка подключения к серверу 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: CERTIFICATE_VERIFY_FAILED] (_ssl.c: 749)

Вот мой успешный вывод, когда язапустите тот же код с Python27:

Состояние сервера базы данных: {"_t": "OKMongoResponse", "ok": 1} Коллекция (База данных (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 ')

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Решена проблема с этим изменением:

client = pymongo.MongoClient(uri, ssl_cert_reqs=ssl.CERT_NONE)
0 голосов
/ 12 июня 2019

Столкнулся с той же проблемой при попытке подключить mongodb из Digital Ocean. Решено с помощью этой функции с параметрами в 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")
0 голосов
/ 04 февраля 2019

Раздел Troubleshooting TLS Errors официального документа PyMongo `TLS / SSL и PyMongo представляет проблему, как показано ниже.

Ошибки TLS часто делятся на две категории, проверка сертификатаошибка или несоответствие версии протокола.Сообщение об ошибке, подобное следующему, означает, что OpenSSL не удалось проверить сертификат сервера:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

Это часто происходит из-за того, что OpenSSL не имеет доступа к корневым сертификатам системы илисертификаты устарели.Пользователи Linux должны убедиться, что у них установлены последние обновления корневого сертификата от их поставщика Linux.Пользователям macOS, использующим Python 3.6.0 или новее, загруженным с python.org , может потребоваться запустить скрипт, включенный в python , для установки корневых сертификатов:

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

Пользователив более старых портативных версиях PyPy и PyPy3 может быть задана переменная среды , чтобы сообщить 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.Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

...