ネットワーク層に Netty を使用するサーバー アプリケーションとそれに対応するクライアントを作成しています。クライアントからサーバーにパスワードを送信する際によくある安全上の懸念に直面しているため、これを行うには SSL が最も安全な方法であると判断しました。
私はセキュアチャットの例を知っており、これを使用してパイプラインを適宜変更します。ただし、パスワードの送信後に SSL を無効にし、サーバー側の貴重な CPU サイクルを節約することを認めたいと思います。サーバー側は、他の多くのクライアントでビジー状態になる可能性があります。ChannelPipelineのドキュメントには、次のように記載されています。
「いったん接続されると、チャネルとパイプラインの間の結合は永続的です。チャネルは別のパイプラインをそれに接続したり、現在のパイプラインを切り離したりすることはできません。」
アイデアは、禁止されているオンザフライでパイプラインを変更するのではなく、パイプライン内のSslHandlerに、ある時点でメッセージの暗号化を停止する必要があることを何らかの方法で伝えることです。SslHandlerから継承するクラスを作成し、そのhandleDownstream関数をオーバーライドして、通信のある時点でcontext.sendDownstream(evt)を呼び出すことを考えていました。
質問 1 : これは悪い考えですか、つまり、ある時点で SSL を無効にしますか?
パイプライン内のブロック ( Decoderなど) が別のブロック ( SslHandler など) に今後の動作を変更する必要があることを伝えるには、ChannelPipelineFactoryのgetPipeline()で AtomicBoolean を作成して渡すことができると考えました。 DecoderとSslHandlerの両方のコンストラクターに。
質問 2 : パイプライン ブロック間で状態を共有することは悪い考えですか? ここでNettyのマルチスレッドを台無しにするのではないかと心配しています.パイプラインのブロックは一度に1つのメッセージで動作していますか? つまり、次のメッセージをプルする前に、最初のブロックは最後のブロックの完了を待ちますか?
編集:
残念ながら、これは私が何度も訪れ、まさにこの質問で引用していたChannelPipelineページからのものです。
「ChannelPipeline はスレッド セーフであるため、ChannelHandler はいつでも追加または削除できます。たとえば、機密情報が交換されようとしているときに SslHandler を挿入し、交換後に削除できます。」
したがって、これは、パイプラインの参照自体ではなく、パイプラインのコンテンツをオンザフライで変更することに関する質問 2 に答えます。