Netty中如何处理SSL握手失败
How to handle SSL handshake failure in Netty
我们正在 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> { ... });
我们正在 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> { ... });