Java中SocketChannel的SSL实现

3

我正在查看java.nio.channels包的类,但只找到了普通的socket实现。我可以使用SSLEngine对流量进行加密和解密,但这需要相当多的处理。有人知道是否有一个适当的SocketChannel实现/扩展,可以在内部处理加密吗?


我有一个,但它是商业产品。 - user207421
很抱歉,目前还没有。如果您与我联系,我可以提供详细信息。我不会在这里发布电子邮件地址,但您可以在http://www.dadaelectronics.eu的联系页面上找到我。 - user207421
@dadaelectronics.eu宣称这是一个四路放大器和调谐器网站。 这是正确的网站吗? - Arteri Xhafur
那就是它。 - user207421
@EJP 那里有4-5个联系人。我应该使用哪一个? - Arteri Xhafur
显示剩余2条评论
3个回答

1

我所见过的最简单的实现是 alkarn SSL Engine Example 这可能是你要寻找的。这是SSLEngine的一个实际实现,总共只有3个类。你可以直接复制并运行。

我会在这里粘贴他的一些文档页面以方便:

服务器

NioSslServer server = new NioSslServer("TLSv1.2", "localhost", 9222);
server.start();

客户端

NioSslClient client = new NioSslClient("TLSv1.2", "localhost", 9222);
client.connect(); 

您可能会想知道为什么没有像这样的东西内置。我对这个特定领域不是非常熟悉,但我知道以下内容在JSSE参考指南中:
新手可能会想知道“为什么不只有一个扩展java.nio.channels.SocketChannel的SSLSocketChannel?”有两个主要原因:
- 有很多关于SSLSocketChannel应该是什么的非常困难的问题,包括它的类层次结构以及它如何与选择器和其他类型的SocketChannels交互。每个提案都带来了更多问题而不是答案。需要注意的是,任何扩展以与SSL/TLS一起工作的新API抽象都需要相同的重要分析,并可能导致大型和复杂的API。 - 任何JSSE实现新API的选择“最佳”I/O和计算策略都是自由的,但隐藏其中任何细节对于那些需要完全控制的应用程序是不合适的。任何具体的实现对于某些应用程序段是不合适的。
请参见:JSSE参考指南

我相信这里的目标是让开发者完全控制实现,以免使软件包无法使用。


SSLEngine的替代方案

你也可以使用Jetty或类似的工具:

过去有一个叫做“SslSelectChannelConnector”的东西,根据您的环境而定,它可能有效。但是,“SslSelectChannelConnector”自版本9以来已被弃用。

可以使用org.eclipse.jetty.server.SslConnectionFactory进行替换。

您可以在这里查看完整文档:Jetty Docs 9.4.7.v20170914

这是使用SslConnectionFactory的示例:Eclipse Github Example 您可能也会对“嵌入式Jetty”方法感兴趣:Embedded Jetty Example

感谢@njfife,我对扩展SocketChannel的SSLSocketChannel实现很感兴趣。看了你的建议,但没有一个具有选择器功能的。很遗憾Oracle没有它(然而复杂,似乎只有那样才能获得巨大的好处)。 - Arteri Xhafur

0

根本问题在于,如果没有选择器线程,你无法在NBIO套接字上内部实现SSLEngine,因为SSLEngine可能需要在代码未读取或写入数据时读取/写入数据。如果以这种方式实现,性能将非常糟糕。


同意你的推理,所以实现可能需要使用选择器线程。但这不会成为一个阻碍,对吧?@EJP,因为他可能有那个实现。 - Arteri Xhafur

-1

为什么这个答案被踩了?对我来说,这个链接确实帮助我实现了SSL引擎的读取操作。 - Ashok Kumar

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