Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 和 TLS/SSL

Posted

技术标签:

【中文标题】Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 和 TLS/SSL【英文标题】:Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel and TLS/SSL 【发布时间】:2012-10-02 23:38:28 【问题描述】:

在 NIO2 上可用的 INTERNET 上的所有源/样本均不支持 TLS/SSL,

java.nio.channels.AsynchronousSocketChannel java.nio.channels.AsynchronousServerSocketChannel

据我了解,SSLEngine 连接的生命周期与 AsynchronousSocketChannel.connect && AsynchronousServerSocketChanne.accept 不同, TLS/SSL 应该被封装在 AIO 实现中,那么我怎样才能同时使用它们......? 注意:我在 Grizzly 项目中的一个视频中谈到他们已经实现了它, 我查看源代码,但我看到了 AIO,但没有看到 TLS/SSL 集成...

提前致谢!

【问题讨论】:

连接的生命周期是一样的:它只是一个连接。然而,由于其他原因,将 SSLEngine 与非阻塞 NIO 集成已经足够困难了,例如当你应该阅读时必须编写,反之亦然,以及如何处理任务:我不不想尝试使用异步 I/O。 PS:刚刚注意到我的赏金评论拼写错误,有人知道如何编辑吗? 我应该添加到我的评论中,我随后实现了一个使用 SSLEngine 的 AsyncSSLSocketChannel。正如预期的那样,这并不容易。 【参考方案1】:

对原问题的评论确实是正确的。 SSLEngine 直接使用ByteBuffer 进行操作。

这意味着它与 AIO 兼容。您首先接受连接。然后客户端连接并执行初始写入。要确定您是否有足够的缓冲数据,请使用handshake status 和status。如果需要从另一端提供更多数据,引擎将不断告诉您“NEED_UNWRAP”。所以你需要保留一个 ByteBuffer 对象的队列。同样,如果在继续之前需要将更多数据发送到另一端,引擎会不断告诉您“NEED_WRAP”。您继续前进,直到您从握手状态中获得“完成”。

不过,我建议您使用 Netty 之类的东西,这会使这变得更简单。需要注意的是,Netty 在 4 的 alpha 阶段确实支持 AIO。但是,显示 AIO 比 NIO 慢。因此,它被删除了。

但是,Netty 不仅比尝试直接使用 NIO 或 AIO 更简单,而且如果重新引入 AIO,也可以轻松地在两者之间切换。

可以在here 找到使用 SSL 和 Netty 的完整示例。

【讨论】:

感谢您的输入,我应该指出我知道如何使用 SSLEngine 并且有一个与传统 nio 一起工作的实现。 AIO 版本,但是我很难在代码上添加任何形状。就我而言,我想学习如何通过自己滚动来实现高效的 AIO 实现。 (在死锁和握手期间协调完成处理程序方面,我只需要一些明智的设计指针)。 现在看看旧版本的带有 AIO 的 netty 以获得指针欢呼。 你会发现代码确实是一样的。 SSLHandler 是一个管道处理程序,无论是与 NIO 还是 AIO 通道工厂一起使用都是相同的github.com/netty/netty/blob/…【参考方案2】:

在 Java 中执行 TLS 的标准方法是使用 SSLEngine。但是那个类真的很难使用。周围有一些教程,但对于典型的应用程序,使用 SSLEngine 应该是不可能的。不直接支持 ByteChannel 和他们的朋友,这意味着很多工作。

前段时间我遇到了同样的问题,最终编写了自己的库。那里有一些示例,当然还有 Netty 等项目中的代码。但是这两个选项都不是健壮的或易于重用的。

TLS Channel 将 SSLEngine 包装在 ByteBuffer 中,并允许像普通的 SocketChannel 一样使用它。 AsynchronousByteChannels 是隐藏选择器循环的更高级别的抽象;该库也支持这一点。

【讨论】:

以上是关于Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 和 TLS/SSL的主要内容,如果未能解决你的问题,请参考以下文章

Java 7 异步 NIO2 服务器上的连接被拒绝

Java nioBlocking nio2

Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 和 TLS/SSL

什么是NIO2

java nio2

Java NIO2:NIO概述