我正在编写一个服务器应用程序及其客户端应用程序,它们都使用 Netty 作为网络层。我发现自己面临从客户端向服务器发送密码的典型安全问题,因此我认为 SSL 是最安全的方式。
我知道安全聊天示例,并将使用它来相应地修改我的管道。但是,我还想在密码传输后禁用 SSL,并确认可以在服务器端节省一些宝贵的 CPU 周期,这可能正忙于许多其他客户端。ChannelPipeline文档指出:
“一旦连接,通道和管道之间的耦合是永久的;通道不能将另一条管道连接到它,也不能将当前管道与其分离。”
然后的想法是不要动态更改管道,这是被禁止的,而是以某种方式告诉管道中的SslHandler它应该在某个时候停止加密消息。我正在考虑创建一个继承自SslHandler的类,覆盖其handleDownstream函数以在通信中的某个时间点调用context.sendDownstream(evt) 。
问题 1:这是一个坏主意,即在某些时候禁用 SSL 吗?
为了允许管道中的一个块(比如Decoder)告诉另一个块(比如SslHandler)它应该从现在开始改变它的行为,我想我可以在我的ChannelPipelineFactory的getPipeline()中创建一个AtomicBoolean并传递它到Decoder和SslHandler的构造函数。
问题2:这是一个坏主意,即在管道块之间共享状态吗?我担心我可能会在这里搞砸 Netty 的多线程:管道的块是否一次只处理一条消息?即:在拉下一条消息之前,第一个块是否等待最后一个块的完成?
编辑:
哦,我的错,这是来自我多次访问并引用这个问题的ChannelPipeline页面:
“由于ChannelPipeline是线程安全的,因此可以随时添加或删除ChannelHandler。例如,您可以在即将交换敏感信息时插入SslHandler,并在交换后将其删除。”
因此,这回答了关于即时修改管道内容的问题 2,而不是管道引用本身。