如何使用 TLS 保护 Java
SocketChannel
、ServerSocketChannel
甚至 DatagramChannel
?
SSLEngine
,如使用 SSLEngine 的非阻塞 I/O 中所述。您提到的库使用它或使用使用它的库。
(请注意,这是出了名的难以使用。)
您可能会发现这些链接很有趣:
对于数据报,您应该考虑使用 DTLS 而不是 TLS。我不确定它在 Java 中的实现状态,但您可以挖掘
java.openjdk.security.devel
邮件列表的档案。
您需要使用 SSLEngine 并使用该状态机手动进行握手。 SSL/TLS 是在 TCP 之上实现的,因此您不能直接在
DatagramChannel
之上使用它。
文章使用 SSLEngine 实现非阻塞 I/O 可能会有所帮助。
正如 Bruno 正确提到的那样,执行此操作的标准方法是使用 SSLEngine。但那个类说真的很难使用。
我不久前遇到了同样的问题,最终编写了自己的库。那里有一些示例,当然也有 Netty 等项目中的代码。但这两种选项都不健壮或易于重用。
TLS Channel 将 SSLEngine 包装在 ByteBuffer 中,并允许像普通 SocketChannel 一样使用它。