首页 > 解决方案 > 是否可以连接到 https URL?

问题描述

我有一个使用 http 运行良好的简单代码(不安全),但随后我将其更新为 https 出现错误ssl.SSLCertVerificationError

我正在使用具有有效 ssl 的 heroku 服务器,当然,mac 上的 python 3.7.3,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)

有任何想法吗 ?

标签: pythonpython-3.xsslwebsocketpython-socketio

解决方案


最后我让它工作了,我在另一台具有相同软件条件的 Mac 计算机上尝试了相同的代码,它工作正常,也在 aPC with Ubuntu和 a上Raspberry Pi with Raspbian,一切正常,所以再次回到有问题的第一台 Mac 上,我开始调试再次,重新安装和更新软件包,pip但什么也没发生。

我尝试过的其他解决方案是重新安装certifi软件包,pip但没有得到任何修复。

最后,解决问题的方法是运行 Python 附带的位于 中的脚本/Applications/Python 3.X/Install Certificates.command,您可以直接Finder在其上双击运行它,也可以在终端上转到该文件夹​​并执行它。

完成此操作后,我进行了测试python-socketio 3.1.2python-socketio 4.0.1一切正常。

最后的建议,如果您在尝试运行脚本后仍然遇到相同的错误,您可以尝试一个替代python-socketio方法socketIO-client-2初始条件(在运行脚本之前)。运行上面的脚本后,现在都运行完美了。


推荐阅读