Java.nio频道和TLS

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

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

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

(请注意,这是非常难以使用的。)

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

  • 这个答案 (其中还包含书籍章节的链接)。
  • Jean-FrançoisArcand在Grizzly实施的笔记 。
  • 使用异步SSL / TLS可以获得的问题类型的示例 。
  • 熟悉这些问题中提到的问题也应该是相关的(特别是如何在异步模式下处理它们)。
  • Simple Framework还支持异步SSL / TLS。

对于Datagrams,您应该考虑使用DTLS而不是TLS。 我不确定它在Java中的实现状态,但你可以深入研究java.openjdk.security.devel邮件列表的档案。

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

使用Java NIO的文章SSL可能会有所帮助。

正如布鲁诺正确提到的那样,标准的做法是使用SSLEngine。 但是这个课程很难使用。

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

TLS Channel将SSLEngine包装在ByteBuffer中,并允许像普通的SocketChannel一样使用它。