如何在Netty中处理SSL握手失败

时间:2015-02-27 17:32:44

标签: ssl netty

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

有一些解决方案:

  1. 客户端 - 服务器连接可以故障转移到未加密模式 (从管道中删除SslHandler)。
  2. 客户端可能因为知道SSL异常而死亡并抛出异常。
  3. 不幸的是我不知道如何使用Netty实现这一点。几个问题:

    1. 如何检测它的SSL异常?
    2. 如何安全地从两侧移除SslHandler?
    3. 请在这里帮忙。

1 个答案:

答案 0 :(得分:1)

据我所知,没有安全的方法可以将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> { ... });