我们正在Netty之上实现SSL。但是目前的设计存在缺陷。如果失败,客户端将重试连接到服务器。这在网络或服务器负载过重的问题中是理想的。但是错误的客户端凭据将导致持续失败。

有一些解决方案:


客户端-服务器连接可以故障转移到未加密模式
(从管道中删除SslHandler)。
客户端可以在知道SSL异常的情况下死亡并抛出异常。


不幸的是,我不知道如何使用Netty来实现这一点。几个问题:


如何检测到它的SSL异常?
如何安全地从两侧删除SslHandler?


请在这里帮忙。

最佳答案

据我所知,没有安全的方法可以将SSL连接降级为纯文本连接。

要检测握手失败,您需要实现userEventTriggered()处理程序方法:

public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
    if (evt instanceof SslHandshakeCompletionEvent) {
        if (!((SslHandshakeCompletionEvent) evt).isSuccess()) {
            // handshake failed
        }
    }
}


您还可以在握手的未来中添加一个侦听器:

ChannelPipeline p = ...;
SslHandler sslHandler = p.get(SslHandler.class);
sslHandler.handshakeFuture().addListener(new FutureListener<Channel> { ... });

关于ssl - 如何处理Netty中的SSL握手失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28770962/

10-10 14:46