【发布时间】:2019-01-13 13:36:26
【问题描述】:
我有一个能够相互通信的 netty TLS 客户端和服务器,我希望在某些时候关闭 TLS 会话,但不关闭不依赖的 tcp 连接(以及各自的 netty 通道)。
SslHandler 的 JavaDoc 似乎暗示这是可能的,并且其中有一个方法似乎可以做到这一点:
public void close(ChannelHandlerContext ctx, final ChannelPromise promise) { ... }
但是,当我像这样在服务器处理程序中调用它时:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
// ...
ChannelPromise endTls = ctx.newPromise().addListener(f -> {
log.debug("This is never reached :-(");
});
sslHandler.close(ctx, endTls);
// ...
}
...什么也没有发生,即
- endTls 永远不会完成;
- 在客户端,不会通知 clientSslHandler.sslCloseFuture() 的侦听器。
我尝试从服务器、客户端和两者使用 close(ctx, promise),但效果始终相同 - 未来未完成,对等方未收到 close_notify 消息。
有什么建议吗?
【问题讨论】:
-
请问您为什么要这样做?您使用的方法绝对不适用于此用例。
-
这是关于击败防火墙的。假设您在站点 A 上有一个程序,在站点 B 上有另一个程序,但只有站点 B 有一个公共端点并且可以接受传入的 tcp 连接。这个想法是在每个站点上都有一个 tls 服务器和一个 tls 客户端,并在任何方向进行 TLS 连接(任何对等点都可以充当 tls 客户端和/或 tls 服务器)。请注意,这可以在不嵌套 tls 连接的情况下完成。另请注意,所有 tcp 连接始终从站点 A 到站点 B...您所要做的就是能够在同一个 tcp 连接上拥有多个 tls 会话...
标签: netty