Подтвердить что ты не робот

Как реализовать безопасный сервер WebSocket (wss://) в Python?

Я хочу служить потоком в реальном времени, который должен быть надежно зашифрован из-за конфиденциальных данных.

Я успешно получил обычную трансляцию WebSockets, используя как gevent, так и gunicorn в качестве прямых интерфейсов, но теперь мне нужно сделать это безопасным, и я ищу любой из них:

  • Сервер, который может обслуживать безопасные соединения WebSocket, которые проксируются (например), пушки, которые слушают незащищенные соединения WebSocket.
  • Структура, которая может напрямую обслуживать безопасные соединения WebSocket. Я смотрю на Tornado и считаю, что он справится с этим, но я по-прежнему открыт для предложений.
  • Я использую ZeroMQ для шаблона PUB/SUB. Если для ZeroMQ существует хорошая реализация протокола WebSocket, это было бы здорово.

Скорость здесь не очень важна, так как количество соединений будет низким. Однако важна целостность данных.

4b9b3361

Ответ 1

Предполагая, что у вас есть приложение, работающее корректно через не-SSL Tornado WebSockets, измените вызов для прослушивания:

app.listen(args.listen_port, args.listen_interface) 

в

app.listen(args.listen_port, args.listen_interface, ssl_options={ 
        "certfile": os.path.join(lib_dir, "mydomain.crt"),
        "keyfile": os.path.join(lib_dir, "mydomain.key"),
    })

где "mydomain.crt" и "mydomain.key" являются вашими обычными файлами сертификатов SSL, а lib_dir - это каталог, в котором они живут.

Не забудьте изменить клиент для использования "wss:"

Также обратите внимание, что порт, который вы укажете в вызове прослушивания, по-прежнему будет использоваться, если вы укажете ssl_options. то есть он не вернется к прослушиванию на порту 443.

Ответ 2

Вы можете проверить проект websockify. Websockify - это прокси-сервер, который позволяет браузеру, совместимому с WebSockets, взаимодействовать с необработанным двоичным TCP-сервером. Он делает это с помощью base64, кодирующего весь трафик в/из браузера. Тем не менее, проект является модульным, а файл websocket.py - это общий сервер WebSocket, который предназначен для расширения (и есть несколько включенных тестов, которые показывают, как это работает). Было бы довольно легко отключить кодировку base64, если вам не нужен проект.

Websockify также включает в себя библиотеку javascript 'websock.js', которая предназначена для взаимодействия с websockify. Он будет прозрачно отказываться от использования web-socket-js (на основе Flash), если браузер не имеет встроенной поддержки WebSocket.

Websockify поддерживает безопасные соединения (TLS/wss), а также отвечает на запросы политики безопасности Flash, встроенные в один и тот же порт.

Отказ от ответственности: я сделал websockify.

Ответ 3

Мы используем Tornado и Tornadio для нашего приложения в реальном времени, и я просто включил SSL для веб-сайтов, а также всех других протоколов реального времени socket.io. Мне потребовалось чуть больше часа! подробнее здесь:

http://devblog.resolversystems.com/?p=1084

Ответ 4

Посмотрите pywebsocket , поддерживаемый Google.

Обратите внимание, что этот модуль Python использует CGIHTTPServer, поэтому вам нужно настроить его, чтобы он был безопасным. У меня было аналогичное требование для проекта, в котором я участвовал несколько месяцев назад, поэтому я разблокировал модуль standalone.py и удалил зависимости с помощью CGI но я не тестировал безопасные соединения.

Возможно, вы можете импортировать OpenSSL.SSL и настроить WebSocketServer так же, как в моем script. Он должен использовать WebSocketRequestHandler с надлежащей конфигурацией use_tls, private_key и certificate для реализации TLS (Transport Layer Security).

Прочитайте исходный код. Я думаю, вы можете расширить его, чтобы удовлетворить ваши потребности.

Ответ 5

На стороне сервера добавьте это в Tornado:

tornadio2.server.SocketServer(application, ssl_options={
    "certfile": "server.crt",
    "keyfile":  "server.key",
})

На стороне клиента обратитесь к этой ссылке: wss://www.example.com:2201/ws, где 2201 - безопасный порт TLS для Websocket.