Как безопасно подключиться к API Bitstamp Websocket v2.0 с помощью python websockets?Ошибка подтверждения сертификата - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь получить данные о ценах на биткойны в реальном времени из API Bitstamp Websocket v2.0. Где я могу получить сертификат, если это необходимо? Если загрузка сертификата происходит автоматически, как я могу убедиться, что Python может проверить полученный сертификат?

Документация на сайте Bitstamp довольно скудна по этому вопросу. Вот цитата из документации Bitstamp API:

«После того, как вы откроете соединение с помощью рукопожатия websocket (используя заголовок обновления HTTP), вы сможете подписаться на нужные каналы.»

Bitstamp api docs: https://www.bitstamp.net/websocket/v2/

Пробный поиск в документации по websockets: https://websockets.readthedocs.io/en/stable/

Я изучил веб-сокеты и 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())

Из того, что я понимаю в документации по websocket, добавление ssl = True должно быть достаточно для установления безопасного соединения. Но, похоже, что сертификат битовой метки не распознается центром сертификации, встроенным в Python 3.6. и вот почему возникает ошибка?

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)

1 Ответ

1 голос
/ 24 апреля 2019

Я не тратил время на изучение этой проблемы с сертификатом ssl для Bitstamp. Но я просто отключил проверку 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})
...