機密データのために安全に暗号化する必要があるリアルタイムストリームを提供したいと思います。
Geventとgunicornの両方を直接フロントエンドとして使用する通常のWebSocketストリーミングを正常に取得しましたが、安全にする必要があり、次のいずれかを探しています。
接続数が少なくなるため、ここでは速度はそれほど重要ではありません。ただし、データの整合性は重要です。
非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でのリスニングに戻りません。
websockify プロジェクトをチェックアウトできます。 Websockifyは、WebSocket対応のブラウザーが生のバイナリTCPサーバーと通信できるようにするプロキシです。ブラウザーとの間のすべてのトラフィックをbase64エンコードすることでこれを行います。ただし、プロジェクトはモジュール式であり、 websocket.pyファイルは、拡張するように設計された一般的なWebSocketサーバーです(これがどのように機能するかを示すテストがいくつか含まれています)。プロジェクトで必要ない場合は、base64エンコーディングを無効にするのはかなり簡単です。
Websockifyには、websockifyと対話するように設計されたJavascriptライブラリ「websock.js」も含まれています。ブラウザがネイティブのWebSocketをサポートしていない場合は、 web-socket-js (Flashベース)の使用に透過的にフォールバックします。
Websockifyは、セキュア(TLS/wss)接続をサポートし、同じポートでFlashセキュリティポリシー要求にインラインで応答することもできます。
免責事項:私はwebsockifyを作成しました。
リアルタイムアプリにはTornadoとTornadioを使用していますが、WebSocketと他のすべてのリアルタイムアプリでSSLをオンにしましたsocket.io
プロトコル。 1時間強かかりました!詳細はこちら:
Googleがサポートしている pywebsocket プロジェクトの スタンドアロンwebsocketsサーバー を見てください。
このPythonモジュールはCGIHTTPServer
を使用するため、安全にするために微調整する必要があることに注意してください。数か月前に関与したプロジェクトにも同様の要件があったので、 standalone.py モジュールをフォークし、CGIのものとの依存関係を削除しましたが、安全な接続はあまりテストしていません。
たぶん、OpenSSL.SSL
をインポートして、私のスクリプトのようにWebSocketServer
を設定できます。 TLS(Transport Layer Security)を実装するには、use_tls
、private_key
、およびWebSocketRequestHandler
の適切な構成でcertificate
を使用する必要があります。
ソースコードを読んでください。ニーズに合わせて拡張できると思います。
サーバー側でこれをトルネードに追加します。
tornadio2.server.SocketServer(application, ssl_options={
"certfile": "server.crt",
"keyfile": "server.key",
})
クライアント側では、次のリンクを参照してください:wss://www.example.com:2201/ws
、ここで2201は安全なWebsocketのTLSポートです。