我有一个需要在其中使用ServerSocketChannelSocketChannel的应用程序,但是SSLContext给了我ServerSocketFactory这给了ServerSocket并接受了Socket s中的连接。谢谢

最佳答案

“基本” JSSE .getSocketFactory.getServerSocketFactory间接创建客户端SSLSocketSSLServerSocket,反过来又创建服务器端SSLSocket,在任何情况下,它们均是Socket子类(具有一些添加的方法)并以对大多数应用程序最简单的简单等待方式管理SSL / TLS协议和网络I / O。

要使用通道,必须改为创建仅处理SSL / TLS协议而不处理网络(或其他!)I / O的SSLEngine。然后,您自己读写SocketChannel,发送SSLEngine已“包装”的数据,并将接收到的数据提供给“展开”。

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

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

或者Java SSLEngine example有一些做过示例的人的链接,但我自己没有看过。

08-05 14:23