問題タブ [python-socketio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
4249 参照

python - Flask-socketio サーバーと python-socketio 間の安全な通信

私は、flask-socketio と python-socketio を使用してプロジェクトに取り組んでいます。通信を保護するには、システムを SSL にアップグレードする必要があります。Mac と Python 3.7 を使用しています。

openssl ( rootCA.pem) を使用して証明書を作成し、Mac のキーチェーンに追加しました。その後、 と を発行server.certserver.keyましたrootCA.pem。Flask-socketio を使用して Web サーバーを構築し、その側に追加server.certしました。server.key最終的に、Web サイトは ssl でうまく機能しました。

この問題は、flask-socketio サーバーと python-socketio クライアントの間の通信を保護したいときに発生しました。クライアントがサーバーに接続しようとすると、接続が拒否され、発生しましたunknown ca error:

私はいくつかの調査を行い、この問題は Python 3.7 が OpenSSL の独自のプライベート コピーを使用していることが原因である可能性があることに気付きました。そのため、SocketIO クライアントは自己署名証明書を検証できませんでした。そして、これは Python 3.7 のインストールからの情報です:

この Python 3.7 の亜種には、OpenSSL 1.1.1 の独自のプライベート コピーが含まれています。非推奨の Apple 提供の OpenSSL ライブラリは使用されなくなりました。 これは、キーチェーン アクセス アプリケーションとセキュリティ コマンド ライン ユーティリティによって管理されるシステム キーチェーンとユーザー キーチェーンの信頼証明書が、Python ssl モジュールによってデフォルトとして使用されなくなったことを意味します。 サンプル コマンド スクリプトが /Applications/Python 3.7 に含まれており、サードパーティの certifi パッケージ ( https://pypi.org/project/certifi/ ) からデフォルトのルート証明書の精選されたバンドルをインストールします。certifi の使用を選択した場合は、プロジェクトの電子メール更新サービスに登録して、証明書バンドルが更新されたときに通知を受けることを検討してください。

だから私はのフォルダに行き/Applications/Python 3.7Install Certificates.command.

しかし、それは問題の鍵ではありません。python certifi は、ルート証明書の厳選されたコレクションであるためです。もちろん、私の自己署名証明書は含まれていません。したがって、問題を解決するには、Python にrootCA.pem.

python certifi のフォルダに、 という名前のドキュメントがありますcacert.pem。これにはルート証明書が含まれます。そこでrootCA.pem、 の最後にの内容を追加しましたcacert.pem

その後、コマンドラインで次のコードを試しました。

そして出力:

cacert.pemこの場合、サーバーの証明書を検証できると思います。私はそれがエレガントな解決策ではないことを知っています。Python に自己署名証明書を見つけさせるより良い方法があれば教えてください。

その後、python-socketioでflask-socketioサーバーに接続してみました。今回は、別のエラーが発生しました。サーバー側では、ログ情報は次のとおりです。

クライアント側では、次のようにエラーがスローされました。

なぜそれが起こるのか分かりません。Flask-socketio サーバーと python-socketio クライアント間の通信は、SSL なしでうまく機能します。したがって、コードに問題はないと思いますが、ここにコードを示します。そして、これはサーバー用です:

これはクライアント用です:

助けてください!私の質問が冗長であることは承知しています。しかし、問題を解決しようとした方法を示したいだけです。何か問題がある場合は、お知らせください。ありがとうございました!