我正在查看java.nio.channels包的类,但只查找普通的socket实现。我可以使用SSLEngine加密和解密流量,但这将是相当多的处理。有人知道在内部处理加密的SocketChannel的正确实现/扩展吗?
答案 0 :(得分:0)
我看到的最简单的实现是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的新手可能会怀疑&#34;为什么不只是有一个扩展java.nio.channels.SocketChannel的SSLSocketChannel?&#34;那里 有两个主要原因:
- 关于什么,有很多非常困难的问题 应该是SSLSocketChannel,包括它的类层次结构以及它如何 应该与选择器和其他类型的SocketChannel互操作。 每个提案提出的问题多于答案。有人指出 任何扩展为使用SSL / TLS的新API抽象都会 需要相同的重要分析,并可能导致大和 复杂的API。
- 新API的任何JSSE实现都是免费的 选择最好的&#34; I / O&amp;计算策略,但隐藏其中任何一个 细节不适合那些需要完全控制的应用程序。 任何具体的实施都不适合某些人 应用程序部分。
我认为这里的目标是允许开发人员完全控制实现,以免使包无法使用。
替代SSLEngine
你也可以使用Jetty或类似的东西:
曾经有一种名为&#34; SslSelectChannelConnector&#34;这取决于您在环境中可用的内容。 然而,&#34; SslSelectChannelConnector&#34;从那以后被弃用了(我想从版本9开始)?
替换为org.eclipse.jetty.server.SslConnectionFactory
您可以在此处查看完整的文档:Jetty Docs 9.4.7.v20170914
以下是使用的SslConnectionFactory示例:Eclipse Github Example
你可能会发现这个&#34;嵌入式Jetty&#34;方法也很有趣:Embedded Jetty Example
答案 1 :(得分:0)
根本问题是你不能在没有选择器线程的情况下在NBIO套接字上内部实现SSLEngine,因为SSLEngine可能必须在代码不读或写时读/写数据。如果以这种方式实施,表现将会非常糟糕。
答案 2 :(得分:-2)
sslEngine的一个很好的例子可以在下面的git repo中找到: https://github.com/jesperdj/sslclient/blob/master/src/main/java/com/jesperdj/sslclient/SSLSocketChannel.java