是否可以连接到 https URL?

Posted

技术标签:

【中文标题】是否可以连接到 https URL?【英文标题】:Is it possible to connect to a https URL? 【发布时间】:2019-05-02 06:32:54 【问题描述】:

我有一个使用 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,@ 987654325@=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.如果您认为不应该提供 url,请删除跟踪栏 url(您似乎注意到了)。 2. 我刚刚测试了你的代码,它在 Linux 中使用 python-socketio-4.0.1 正常工作 感谢@eyllanesc 的建议,在这种情况下,服务器 url 不是问题,因为服务器只是为了测试它,我刚刚更新到 python-socketio-4.0.1,但我得到了同样的错误mac 与 macOS Mojave (10.14.4) ...我将尝试在 Linux 上进行测试。另一方面,我尝试使用 curl 命令从终端(从同一台机器)访问相同的 URL,并且 ssl 证书的验证效果很好。 我无法重现这个问题我可以很好地连接到 Heroku 应用程序。 【参考方案1】:

最后我让它工作了,我在另一台具有相同软件条件的 Mac 计算机上尝试了相同的代码,它工作正常,同样在 PC with UbuntuRaspberry Pi with Raspbian 上,一切正常,所以再次回到第一个Mac 出现问题,我再次开始调试,使用pip 重新安装和更新软件包,但没有任何反应。

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

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

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

最后的建议,如果您在尝试运行脚本后仍然遇到相同的错误,您可以尝试python-socketio 的替代方法,在解决这个问题的过程中我尝试过socketIO-client-2 当我得到错误和这个库在初始条件下运行良好(在运行脚本之前)。运行上面的脚本后,现在都运行完美了。

【讨论】:

以上是关于是否可以连接到 https URL?的主要内容,如果未能解决你的问题,请参考以下文章

java怎么判断成功连接到数据库

Vue.js:将变量连接到图像 URL

Java - 通过浏览器/URL 连接到 ServerSocket

R-无需打开文本编辑器即可连接到文本文件

使 https 连接到 www 子域的方法

检测设备是否连接到哪个网络,然后从服务器发送数据取决于连接的网络