如何使用 python websockets 安全连接到 Bitstamp Websocket v2.0 API?证书验证错误

Mar*_*rko 5 python ssl certificate verify websocket

我正在尝试从 Bitstamp Websocket v2.0 API 获取实时比特币价格数据。如果需要的话去哪里获取证书?如果证书下载是自动的,我如何确保python可以验证收到的证书?

Bitstamp 网站上关于此事的文档相当缺乏。以下是 Bitstamp api 文档中的引用:

“一旦通过 websocket 握手(使用 HTTP 升级标头)打开连接,您就可以订阅所需的频道。”

Bitstamp API 文档:https://www.bitstamp.net/websocket/v2/

尝试在 websockets 文档中搜索:https://websockets.readthedocs.io/en/stable/

我研究过 websockets 和 ssl。现在我对握手有了一些了解,但经过多次尝试和搜索后我仍然不知道该怎么做。

import asyncio
import websockets

async def bitstamp_ticker():
    async with websockets.connect(
            'wss://ws.bitstamp.net', ssl=True) as websocket:
        pass

asyncio.get_event_loop().run_until_complete(bitstamp_ticker())
Run Code Online (Sandbox Code Playgroud)

根据我在 websocket 文档中的理解,添加 ssl=True 应该足以建立安全连接。但似乎 Python 3.6 中内置的证书颁发机构无法识别位戳证书。这就是错误发生的原因?

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)
Run Code Online (Sandbox Code Playgroud)

小智 5

我没有花时间研究 Bitstamp 的 ssl 证书问题。但我只是禁用了 ssl 证书验证以使网络套接字市场数据推送工作。以下是示例代码,如果您能分享您在这个问题上的未来进展,我们将不胜感激。

# -*- coding: utf-8 -*-
import websocket
import json
import ssl

bitstamp_endpoint = 'wss://ws.bitstamp.net'


def subscribe_marketdata(ws):
    params = {
        'event': 'bts:subscribe',
        'data': {
            'channel': 'order_book_btcusd'
        }
    }
    market_depth_subscription = json.dumps(params)

    ws.send(market_depth_subscription)


def on_open(ws):
    print('web-socket connected.')
    subscribe_marketdata(ws)


def on_message(ws, data):
    data = json.loads(data)
    print(data)


def on_error(ws, msg):
    print(msg)


if __name__ == '__main__':
    marketdata_ws = websocket.WebSocketApp(bitstamp_endpoint, on_open=on_open, on_message=on_message, on_error=on_error)
    marketdata_ws.run_forever(sslopt={'cert_reqs': ssl.CERT_NONE})
Run Code Online (Sandbox Code Playgroud)