我该如何使用TLS保护Java的SocketChannel,ServerSocketChannel或甚至是DatagramChannel? 我知道有一些框架(#1 #2)声称可以实现,但我想知道是否仅使用纯Java标准库就能够实现。
您需要使用SSLEngine,如SSLEngine的非阻塞I/O文档所述。 您提到的库使用它或使用使用它的库。(请注意,这是非常难以使用的。)您可能会发现以下链接有趣: 这个答案(其中还包含链接到书籍章节)。 Jean-François Arcand的笔记,他在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 Channel将SSLEngine包装在ByteBuffer中,并允许像普通SocketChannels一样使用它。
SSLSocket
而不是 NIO 的。 - Bruno