我有一个需要在其中使用ServerSocketChannel
和SocketChannel
的应用程序,但是SSLContext
给了我ServerSocketFactory
这给了ServerSocket
并接受了Socket
s中的连接。谢谢
最佳答案
“基本” JSSE .getSocketFactory
和.getServerSocketFactory
间接创建客户端SSLSocket
或SSLServerSocket
,反过来又创建服务器端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有一些做过示例的人的链接,但我自己没有看过。