【问题标题】:SSL implementation for SocketChannel in java [closed]java中SocketChannel的SSL实现[关闭]
【发布时间】:2018-03-07 23:58:43
【问题描述】:

我正在查看包 java.nio.channels 的类,但只找到普通的套接字实现。我可以使用 SSLEngine 来加密和解密流量,但这将是相当多的处理。有人知道在内部处理加密的 SocketChannel 的正确实现/扩展吗?

【问题讨论】:

  • 我有一个,但它是商业产品。
  • @EJP 你能分享产品的网站吗?
  • 很抱歉,目前没有。如果您在场外与我联系,我可以为您提供详细信息。我不会在此处发布电子邮件地址,但请在dadaelectronics.eu 的联系人页面中查找我。
  • @EJP dadaelectronics.eu 声明它是四路放大器和调谐器的站点。这是正确的网站吗?
  • 就是这个。

标签: java ssl nio jsse socketchannel


【解决方案1】:

可以在下面的 git repo 中找到一个非常好的 sslEngine 示例: https://github.com/jesperdj/sslclient/blob/master/src/main/java/com/jesperdj/sslclient/SSLSocketChannel.java

【讨论】:

  • 为什么这个答案被否决了?对我来说,这个链接确实帮助我实现了 sslengine 的读取操作。
【解决方案2】:

根本问题是您无法在没有选择器线程的情况下在 NBIO 套接字上内部实现 SSLEngine,因为当您的代码不读取或写入时,SSLEngine 可能必须读取/写入数据。如果以这种方式实现,性能将非常糟糕。

【讨论】:

  • 同意你的推理,所以实现可能需要使用Selector Thread。但这不会是一个表演停止者,对吧? ping @EJP,因为他可能有那个实现。
【解决方案3】:

我见过的最简单的实现是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 参考指南中有以下内容:

API 的新手可能想知道“为什么不使用扩展 java.nio.channels.SocketChannel 的 SSLSocketChannel?”那里 有两个主要原因:

  • 有很多非常困难的问题,关于什么是 SSLSocketChannel 应该是,包括它的类层次结构以及它是如何实现的 应该与选择器和其他类型的 SocketChannel 互操作。 每个提案提出的问题多于答案。有人指出 任何新的 API 抽象扩展为与 SSL/TLS 一起使用都会 需要同样重要的分析,并可能导致大而 复杂的 API。
  • 新 API 的任何 JSSE 实现都可以免费 选择“最佳” I/O 和计算策略,但隐藏其中任何一个 细节对于那些需要完全控制的应用程序是不合适的。 任何特定的实现都不适合某些人 应用部分。

见:JSSE Reference Guide

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


SSLEngine 的替代品

你也可以使用 Jetty 或类似的东西:

曾经有一个叫做“SslSelectChannelConnector”的东西,它可能会根据您的环境中可用的内容而起作用。 但是,“SslSelectChannelConnector”已经被弃用了(我认为是从第 9 版开始)?

替换为org.eclipse.jetty.server.SslConnectionFactory

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

这里是一个使用 SslConnectionFactory 的例子:Eclipse Github Example

您可能会发现这种“嵌入式码头”方法也很有趣:Embedded Jetty Example

【讨论】:

  • 感谢@njfife,我对确实可以扩展 SocketChannel 的 SSLSocketChannel 的实现很感兴趣。查看了您的建议,但没有一个具有选择器功能。太糟糕了,Oracle 没有它(无论多么复杂,拥有它似乎是一个巨大的好处)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2016-12-20
  • 2010-12-21
相关资源
最近更新 更多