Можно ли подключиться к https URL? - PullRequest
1 голос
/ 02 мая 2019

У меня есть простой код, работающий хорошо с использованием http (небезопасно), но затем я обновляю его до https и получаю сообщение об ошибке ssl.SSLCertVerificationError

Я использую сервер heroku с действительным ssl, конечно, python 3.7.3 на Mac, ssl.OPENSSL_VERSION = 1.1.0, certifi = 2019.3.9, Flask = 1.0.2, Flask-SocketIO = 3.3.2

Вот код:

import socketio

sio = socketio.Client()

@sio.on('connect')
def on_connect():
    print('Connected ...')

@sio.on('message')
def on_message(data):
    print('I received a message!')
    print(data)

if __name__ == '__main__':
    sio.connect('https://heroku.server.url')

И вот что я получаю, используя https:

Traceback (most recent call last):
  File "/Users/calavraian/Devel/Projects/FlaskTesting/Client.py", line 21, in <module>
    sio.connect('https://heroku.server.url')
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/socketio/client.py", line 208, in connect
    engineio_path=socketio_path)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/engineio/client.py", line 166, in connect
    url, headers, engineio_path)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/engineio/client.py", line 303, in _connect_polling
    if self._connect_websocket(url, headers, engineio_path):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/engineio/client.py", line 341, in _connect_websocket
    cookie=cookies)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websocket/_core.py", line 514, in create_connection
    websock.connect(url, **options)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websocket/_core.py", line 223, in connect
    options.pop('socket', None))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websocket/_http.py", line 126, in connect
    sock = _ssl_socket(sock, options.sslopt, hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websocket/_http.py", line 260, in _ssl_socket
    sock = _wrap_sni_socket(sock, sslopt, hostname, check_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websocket/_http.py", line 239, in _wrap_sni_socket
    server_hostname=hostname,
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 412, in wrap_socket
    session=session
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 853, in _create
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

Есть идеи?

1 Ответ

0 голосов
/ 08 мая 2019

Наконец-то я заставил его работать, я попробовал тот же код на другом компьютере Mac с тем же программным условием, и он отлично работает, также на PC with Ubuntu и Raspberry Pi with Raspbian, все работает нормально, поэтому снова вернемся к первому Mac с проблемой, я снова начал отлаживать, переустанавливать и обновлять пакеты с pip, и ничего не произошло.

Другое решение, которое я попробовал, состояло в том, чтобы переустановить пакет certifi с pip, но ничего не было исправлено.

В конце концов, проблема была решена запуском скрипта, который поставляется с Python и находится в /Applications/Python 3.X/Install Certificates.command, вы можете запустить его прямо из Finder, дважды щелкнув по нему или на терминале перейти в папку и выполнить его.

После этого я протестировал python-socketio 3.1.2 и python-socketio 4.0.1 и все работает нормально.

Окончательная рекомендация: в случае, если после запуска скрипта вы все еще получаете ту же ошибку, вы можете попробовать альтернативу python-socketio, в процессе, чтобы выяснить это, я пробовал socketIO-client-2, когда получал ошибка и эта библиотека хорошо работали на начальных условиях (до запуска скрипта). После запуска приведенного выше сценария оба работают отлично.

...