Java.nio通道和TLS

15

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

我知道有一些框架(#1 #2)声称可以实现,但我想知道是否仅使用纯Java标准库就能够实现。


http://www.exampledepot.com/egs/javax.net.ssl/client.html - Maurício Linhares
3
@MauricioLinhares: 这些例子是针对 SSLSocket 而不是 NIO 的。 - Bruno
3个回答

21
您需要使用SSLEngine,如SSLEngine的非阻塞I/O文档所述。 您提到的库使用它或使用使用它的库。(请注意,这是非常难以使用的。)
您可能会发现以下链接有趣:
对于数据报,您应该考虑使用DTLS而不是TLS。我不确定Java中的实现状态,但您可以查看java.openjdk.security.devel邮件列表的档案。

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

文章使用SSLEngine进行非阻塞I / O可能会有所帮助。


3
O'Reilly 的链接似乎已失效。 - Mahadeva

6
正如Bruno所说,标准的做法是使用SSLEngine。但是那个类非常难用。
我曾经遇到过同样的问题,最终编写了自己的库。有一些示例和当然还有像Netty等项目中的代码。但是这两个选项都不够强大或易于重用。 TLS Channel将SSLEngine包装在ByteBuffer中,并允许像普通SocketChannels一样使用它。

1
不错!有计划在该库中支持AsynchronousSocketChannel吗? - jyemin
@jyemin,看起来可行,应该只需要在现有接口的顶部添加一个附加层。不知何故,我们需要包装一个选择器循环就像我们已经作为测试拥有的那个。欢迎提交拉取请求! :-) - Mariano Barrios
2
@jyemin,希望不算太晚,但是最新版本已经包含了异步通道支持。 - Mariano Barrios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接