Java.nio Channels and TLS



如何使用TLS保护Java SocketChannelServerSocketChannel,甚至DatagramChannel

我知道有一些框架(#1#2)宣称能够实现,但我想知道是否有可能单独使用纯Java标准库来实现这一点。

您需要使用SSLEngine,如SSLEngine的非阻塞I/O中所述。你提到的库使用它或使用它的库。

(注意,这是出了名的难以使用。)

你可能会发现这些链接很有趣:

  • 这个答案(其中还包含一个链接到一本书的章节)
  • 让-弗朗索瓦·阿坎德的笔记,他在Grizzly实现了这一点
  • 异步SSL/TLS可能遇到的问题类型的示例
  • 熟悉这些问题中提到的问题——这个问题也应该是相关的(特别是如何在异步模式下处理它们)
  • Simple Framework还支持异步SSL/TLS

对于数据报,您应该考虑使用DTLS而不是TLS。我不确定它在Java中的实现状态,但您可以浏览java.openjdk.security.devel邮件列表的档案。

您需要使用SSLEngine并使用该状态机手动进行握手。SSL/TLS是在TCP之上实现的,因此您不能直接在DatagramChannel之上使用它。

SSLEngine的非阻塞I/O一文可能会有所帮助。

正如Bruno正确提到的,实现这一点的标准方法是使用SSLEngine。但是这个类很难使用。

不久前,我遇到了同样的问题,最终我写了自己的图书馆。有一些例子,当然还有Netty等项目中的代码。但这两种选择都不健壮,也不容易重复使用。

TLS通道将SSLEngine封装在ByteBuffer中,并允许像使用普通SocketChannels一样使用它。

最新更新