web-dev-qa-db-ja.com

Pythonで安全なWebSocket(wss://)サーバーを実装するにはどうすればよいですか?

機密データのために安全に暗号化する必要があるリアルタイムストリームを提供したいと思います。

Geventとgunicornの両方を直接フロントエンドとして使用する通常のWebSocketストリーミングを正常に取得しましたが、安全にする必要があり、次のいずれかを探しています。

  1. 安全でないWebSocket接続をリッスンするgunicornにプロキシされる安全なWebSocket接続を提供できるサーバー。
  2. 安全なWebSocket接続を直接提供できるフレームワーク。私はトルネードを見ていて、それがそれを処理できると信じていますが、私はまだ提案を受け入れています。
  3. PUB/SUBパターンにはZeroMQを使用しています。 ZeroMQに適したWebSocketプロトコルの実装があれば、それは素晴らしいことです。

接続数が少なくなるため、ここでは速度はそれほど重要ではありません。ただし、データの整合性は重要です。

17
Blixt

非SSLTornado WebSocketでアプリが正しく実行されていると仮定して、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:」を使用するようにクライアントを変更することを忘れないでください。

また、ssl_optionsを指定した場合でも、listen呼び出しで指定したポートが引き続き使用されることに注意してください。つまり、ポート443でのリスニングに戻りません。

7
northernman

websockify プロジェクトをチェックアウトできます。 Websockifyは、WebSocket対応のブラウザーが生のバイナリTCPサーバーと通信できるようにするプロキシです。ブラウザーとの間のすべてのトラフィックをbase64エンコードすることでこれを行います。ただし、プロジェクトはモジュール式であり、 websocket.pyファイルは、拡張するように設計された一般的なWebSocketサーバーです(これがどのように機能するかを示すテストがいくつか含まれています)。プロジェクトで必要ない場合は、base64エンコーディングを無効にするのはかなり簡単です。

Websockifyには、websockifyと対話するように設計されたJavascriptライブラリ「websock.js」も含まれています。ブラウザがネイティブのWebSocketをサポートしていない場合は、 web-socket-js (Flashベース)の使用に透過的にフォールバックします。

Websockifyは、セキュア(TLS/wss)接続をサポートし、同じポートでFlashセキュリティポリシー要求にインラインで応答することもできます。

免責事項:私はwebsockifyを作成しました。

6
kanaka

リアルタイムアプリにはTornadoとTornadioを使用していますが、WebSocketと他のすべてのリアルタイムアプリでSSLをオンにしましたsocket.ioプロトコル。 1時間強かかりました!詳細はこちら:

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

3
hwjp

Googleがサポートしている pywebsocket プロジェクトの スタンドアロンwebsocketsサーバー を見てください。

このPythonモジュールはCGIHTTPServerを使用するため、安全にするために微調整する必要があることに注意してください。数か月前に関与したプロジェクトにも同様の要件があったので、 standalone.py モジュールをフォークし、CGIのものとの依存関係を削除しましたが、安全な接続はあまりテストしていません。

たぶん、OpenSSL.SSLをインポートして、私のスクリプトのようにWebSocketServerを設定できます。 TLS(Transport Layer Security)を実装するには、use_tlsprivate_key、およびWebSocketRequestHandlerの適切な構成でcertificateを使用する必要があります。

ソースコードを読んでください。ニーズに合わせて拡張できると思います。

2
scoffey

サーバー側でこれをトルネードに追加します。

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

クライアント側では、次のリンクを参照してください:wss://www.example.com:2201/ws、ここで2201は安全なWebsocketのTLSポートです。

1
securecurve