我们正在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/