java中SocketChannel的SSL实现

时间:2017-09-26 16:49:25

标签: java ssl nio jsse socketchannel

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

3 个答案:

答案 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;计算策略,但隐藏其中任何一个   细节不适合那些需要完全控制的应用程序。   任何具体的实施都不适合某些人   应用程序部分。
  •   

请参阅:JSSE Reference Guide

我认为这里的目标是允许开发人员完全控制实现,以免使包无法使用。

替代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