我正在编写一个服务器应用程序及其客户端对应物,它们都使用Netty作为网络层。我发现自己面临着将密码从客户端发送到服务器的典型安全问题,因此我认为SSL是最安全的方法。
我知道securechat示例,并将使用它来相应地修改我的管道。但是,我也想在密码传输后禁用SSL,并确认在服务器端节省一些宝贵的CPU周期,这可能会忙于许多其他客户端。ChannelPipeline留档声明:
一旦连接,通道和管道之间的耦合是永久的;通道不能连接另一个管道,也不能从中分离当前管道
然后,想法是不要动态更改管道(这是被禁止的),而是以某种方式告诉管道中的SslHandler它应该在某个时刻停止加密消息。我想创建一个继承自SslHandler的类,重写其handleDownstream函数以调用上下文。在通信的某个时间点后发送下游(evt)。
问题1:这是个坏主意吗,也就是在某个时候禁用SSL?
为了允许管道中的一个块(比如一个解码器)告诉另一个块(比如SslHandler)它应该从现在开始改变它的行为,我想我可以在我的ChannelPipelineFactory的getPipeline()中创建一个AtomicBoolean,并将其传递给解码器和SslHandler的构造函数。
问题2:这是一个坏主意吗,即在管道块之间共享状态?我担心我可能会在这里搞砸Netty的多线程处理:管道的块是否一次处理一条消息?即:第一个块是否在拉取下一条消息之前等待最后一个块的完成?
编辑:
哦,我的错,这是来自我曾多次访问的渠道管道页面,并在这个问题中引用:
由于ChannelPipeline是线程安全的,因此可以随时添加或移除ChannelHandler。例如,您可以在将要交换敏感信息时插入SslHandler,并在交换后删除它。”
因此,这回答了有关动态修改管道内容的问题 2,而不是管道引用本身。
我不确定Netty,但原则上,您确实可以在同一TCP连接上进行普通流量。有一些缺点:
>
只有身份验证是安全的。MITM可以执行用户意图之外的操作。(这在某种程度上类似于使用HTTP Digest:凭据受到保护,但请求/响应实体不受保护。)
从实现的角度来看,这很难弄对。TLS规范说:
如果使用TLS的应用协议规定,在TLS连接关闭后,任何数据都可以在底层传输上传送,则TLS实现必须在向应用层指示TLS连接已结束之前接收响应的< code>close_notify警报。
这意味着您将以某种方式同步您的流,以等待close_notify
响应,然后再继续您的普通流量。SSLEngine编程模型相当复杂,您可能会发现处理这种情况不需要Netty API。
虽然希望节省一些CPU周期可能是有意义的,但SSL/TLS的大部分开销都在握手中,您无论如何都要这样做。用于数据实际加密的对称加密操作成本低得多。(您应该尝试测量此开销,看看它是否真的是一个问题。)
您可以使用通道管道.删除(..)
从管道中删除 SslHandler
,然后它应该将您的连接转换为纯文本。如果它不起作用,请提交一个错误 - 我们实际上还没有在生产中尝试过这种情况:-)
我不确定一旦建立SSL,关闭SSL的效果如何,但我认为您误解了管道的可变性。一旦给定的通道与管道相关联,则该关联是不可变的。但是,可以安全地修改管道中的处理程序。也就是说,您可以根据协议要求添加和删除处理程序。因此,一旦SSL处理程序达到其目的,您应该能够删除它。
我们所面临的问题已在许多文件中得到充分证明https://stackoverflow.com/questions/34189756/warning-about-ssl-connection-when-connecting-to-mysql-database. 从过渡到时,我们就开始面临这个问题。建议的修复方法对我们有效,但我们有一个问题,我们不想更新Java源文件以进行更改,例如从 到 正如在ht
我在下面的代码中得到安全证书错误(源代码)。例外情况是: javax.net.ssl.sslHandShakeException:Sun.Security.Validator.ValidatorException:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径 如何禁用安全证书
我正在开发一个系统,其中几个服务器需要相互连接并交换数据。我想在每台服务器中创建一个服务器套接字,接受新的传入连接,但同时向其他服务器发起一些出站连接。 一旦建立了连接,无论是入站还是出站,我都希望使用它,而不区分谁是发起人。毕竟,一旦建立,TCP连接是对称的。。。 有没有办法用Netty做到这一点?[我是新手…]看看ServerBootstrap,我不知道如何打开出站连接并“附加”它,以便我在S
HTTPProxyHandler总是发送连接请求是正确的吗?这不是只在你想做隧道的时候才适用吗?
我正在尝试连接到LDAP以对用户进行身份验证。下面是我的代码,但是我不能使用我的C#代码设置SSL。 我从我的应用程序安全小组收到一条消息,我正在发送普通密码,所以我试图通过将身份验证类型设置为安全来保护它,通过尝试将选项设置为 但是我在连接对象中没有看到任何Sessionoption,我正在使用novel.LDAP dll进行LDAP操作。 有谁能帮帮我吗?如何在网络上以安全的方式发送密码供ld
我第一次使用带有IISExpress的新Visual Studio 2013(以前 ASP.net VS2010上的开发服务器使用)。我在尝试调试项目时遇到问题。 这是我在Chrome看到的: 无法与服务器建立安全连接。这可能是服务器的问题,也可能需要您没有的客户端身份验证证书。错误代码:ERR_SSL_PROTOCOL_ERROR 我更新了我的计划—— 与localhost的连接中断。错误代码: