Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以连接到https URL?_Python_Python 3.x_Ssl_Websocket_Python Socketio - Fatal编程技术网

Python 是否可以连接到https URL?

Python 是否可以连接到https URL?,python,python-3.x,ssl,websocket,python-socketio,Python,Python 3.x,Ssl,Websocket,Python Socketio,我有一个使用http(不安全)运行良好的简单代码,但随后我将其更新为https,并得到一个关于ssl.SSLCertVerificationError的错误 我使用的是heroku服务器,当然是带有有效ssl的mac上的python 3.7.3,ssl.OPENSSL\u版本=1.1.0,certifi=2019.3.9,Flask=1.0.2,Flask SocketIO=3.3.2 代码如下: import socketio sio = socketio.Client() @sio.on

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

我使用的是heroku服务器,当然是带有有效ssl的mac上的python 3.7.3,
ssl.OPENSSL\u版本
=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)
回溯(最近一次呼叫最后一次):
文件“/Users/calavraian/Devel/Projects/FlaskTesting/Client.py”,第21行,在
sio.connect('https://heroku.server.url')
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/socketio/client.py”,第208行,在connect中
引擎路径=socketio路径)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/engineio/client.py”,第166行,在connect中
url、标题、引擎路径)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/engineio/client.py”,第303行,在“连接”轮询中
如果self.\u connect\u websocket(url、标题、引擎路径):
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/engineio/client.py”,第341行,在_connect_websocket中
cookie=cookie)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/websocket/_core.py”,第514行,位于create_connection中
连接(url,**选项)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/websocket/_core.py”,第223行,在connect中
options.pop('socket',None))
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/websocket/_http.py”,第126行,在connect中
sock=\u ssl\u套接字(sock,options.sslopt,主机名)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/websocket/_http.py”,第260行,在ssl_套接字中
sock=\u wrap\u sni\u套接字(sock、sslopt、主机名、检查主机名)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site packages/websocket/_http.py”,第239行,在sni_-socket中
服务器\主机名=主机名,
wrap_socket中的文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py”,第412行
会话=会话
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py”,第853行,在
self.do_握手
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py”,第1117行,在do_握手中
赛尔夫:握手
ssl.SSLCertVerificationError:[ssl:证书\u验证\u失败]证书验证失败:无法获取本地颁发者证书(\u ssl.c:1056)

有什么想法吗?

最后我让它工作了,我在另一台Mac电脑上用同样的软件条件尝试了同样的代码,效果很好,同样是在一台带有Ubuntu的
电脑和一台带有Raspbian的
Raspberry Pi上,一切都很好,所以回到有问题的第一台Mac电脑上,我再次开始调试,使用
pip
重新安装和更新软件包,但什么也没有发生

我尝试过的另一个解决方案是用
pip
重新安装
certifi
软件包,但没有解决任何问题

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

完成此操作后,我测试了
pythonsocketio3.1.2
pythonsocketio4.0.1
,一切正常


最后一个建议是,如果您在尝试运行脚本后仍然遇到相同的错误,您可以尝试使用
python socketio
的替代方法,在找出错误的过程中,我在遇到错误时尝试了
socketio-client-2
,该库在初始条件下运行良好(在运行脚本之前)在运行了上面的脚本之后,这两个脚本现在都运行得很好。

最后我成功了,我在另一台Mac电脑上用同样的软件条件尝试了同样的代码,效果很好,同样在一台装有Ubuntu的
电脑和一台装有Raspbian的
Raspberry Pi电脑上,一切都很好,所以回到有问题的第一台Mac电脑上,我再次开始调试,用
pip
重新安装和更新包,但什么也没发生

我尝试过的另一个解决方案是用
pip
重新安装
certifi
软件包,但没有解决任何问题

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

完成此操作后,我测试了
pythonsocketio3.1.2
pythonsocketio4.0.1
,一切正常


最后一个建议是,如果您在尝试运行脚本后仍然遇到相同的错误,您可以尝试使用
python socketio
的替代方法,在找出错误的过程中,我在遇到错误时尝试了
socketio-client-2
,该库在初始条件下运行良好(在运行脚本之前)。在运行上述脚本之后,两者现在都运行得很好。

您能分享错误的完整堆栈跟踪吗?当然,我刚刚用完整堆栈跟踪更新了帖子,谢谢!1.如果您认为不应该提供url,请删除跟踪程序url(您似乎注意到了).2.我刚刚用python-socketio-4.0.1测试了您的代码,它在Linux中正常工作。感谢@eyllanesc的建议,在这种情况下,服务器url不是问题,因为服务器只是为了测试这个,我刚刚更新到
python