Как я могу реализовать защищенный сервер WebSocket (wss: //) на Python?

#python #websocket

#python #websocket

Вопрос:

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

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

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

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

Ответ №1:

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

 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:»

Также обратите внимание, что порт, указанный вами в вызове listen, будет по-прежнему использоваться, если вы укажете 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:

Взгляните на автономный сервер websockets проекта pywebsocket, поддерживаемого Google.

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

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

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

Комментарии:

1. 1, потому что эта реализация очень легкая (один маленький файл модуля python, без зависимостей) и поддерживает как ws, так и wss «из коробки».

Ответ №4:

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

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

Ответ №5:

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

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

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