Можно ли подключиться к https URL?
У меня есть простой код, работающий хорошо с использованием 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 ответ
Наконец, я заставил его работать, я попробовал тот же код на другом компьютере 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
когда я получал сообщение об ошибке, и эта библиотека хорошо работала в начальных условиях (до запуска сценария). После запуска вышеуказанного скрипта оба работают отлично.