2016-06-11 146 views

回答

1

“基本” JSSE .getSocketFactory.getServerSocketFactory间接创建客户端SSLSocket,或SSLServerSocket这反过来又创造服务器端SSLSocket,这在任一情况下的子类Socket(有一些添加的方法),并同时管理SSL/TLS协议和网络I/O以简单等待的风格进行,这对于(大多数)应用程序来说是最简单的。

使用渠道,必须,而不是创建一个SSLEngine的它处理的SSL/TLS协议,网络(或其他!)I/O。然后,您自己读写SocketChannel,发送数据SSLEngine已'包装'并将接收到的数据提供给'unwrap'。

有关概述,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLEngine其中有部分示例代码 - 对于客户端;您需要使用对等身份提示将setUseClientMode更改为false而不是。 (SSL/TLS客户端必须按照服务器标识(缓存和)选择保存的会话,但服务器只使用它先前分配的会话ID和客户端记忆。)

然后请参阅javadoc(具有异常详细的介绍)在https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLEngine.html上的SSLEngine类或您最喜欢的JDK/IDE中。

Java SSLEngine example与做过示例的人有一些联系,但我没有亲自看过他们。

1

这样做的标准方法是使用SSLEngine。但是那个级别的认真很难使用。有一些教程,但对于典型的应用程序,使用SSLEngine应该不成问题。

前段时间我遇到了同样的问题,最后写了我自己的库。这里有一些例子,当然也有像Netty这样的项目中的代码等等。但是这两个选项都不健壮或不易重复使用。

TLS Channel将SSLEngine包装在ByteBuffer中,并允许像使用普通SocketChannels一样使用它。

相关问题