【问题标题】:Using netty's SslHandler::close(ChannelHandlerContext, ChannelPromise)使用 netty 的 SslHandler::close(ChannelHandlerContext, ChannelPromise)
【发布时间】: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);

    // ...
}

...什么也没有发生,即

  1. endTls 永远不会完成;
  2. 在客户端,不会通知 clientSslHandler.sslCloseFuture() 的侦听器。

我尝试从服务器、客户端和两者使用 close(ctx, promise),但效果始终相同 - 未来未完成,对等方未收到 close_notify 消息。

有什么建议吗?

【问题讨论】:

  • 请问您为什么要这样做?您使用的方法绝对不适用于此用例。
  • 这是关于击败防火墙的。假设您在站点 A 上有一个程序,在站点 B 上有另一个程序,但只有站点 B 有一个公共端点并且可以接受传入的 tcp 连接。这个想法是在每个站点上都有一个 tls 服务器和一个 tls 客户端,并在任何方向进行 TLS 连接(任何对等点都可以充当 tls 客户端和/或 tls 服务器)。请注意,这可以在不嵌套 tls 连接的情况下完成。另请注意,所有 tcp 连接始终从站点 A 到站点 B...您所要做的就是能够在同一个 tcp 连接上拥有多个 tls 会话...

标签: netty


【解决方案1】:

我认为您正在寻找的是sslHandler.close()sslHandler.close(promise)。让我知道它是否符合您的要求。

【讨论】:

  • 我可以使用 sslHandler.close(promise)。但是,这个 API 在我使用的 Netty 版本中已被弃用:4.1.24。知道为什么 sslHandler.close(ctx, endTls) 版本不起作用吗?
  • 是的,我知道它已被弃用,但这可能是我们的错,我们可能应该“取消弃用”它。这就是我问的原因。
  • 我尝试使用 closeOutbound 但我不明白如果 SslHandler 在另一边closes connection 无论如何我们可以利用开放连接。我是否正确理解 closeOutbound 的目的(关闭 ssl 会话后继续使用相同的连接)?
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多