我有一个应用程序,我需要在其中使用ServerSocketChannel
和SocketChannel
,但是SSLContext
给了我ServerSocketFactory
,它提供ServerSocket
并接受Socket
中的连接{1}} s。
任何解决方案?感谢
答案 0 :(得分:1)
'基本' JSSE .getSocketFactory
和.getServerSocketFactory
间接创建客户端SSLSocket
或SSLServerSocket
,后者又创建服务器端SSLSocket
,在任何一种情况下都是子类{{1} (使用一些添加的方法)并以简单等待的方式管理SSL / TLS协议和网络I / O,这对于(大多数)应用程序来说是最简单的。
要使用频道,您必须而不是创建一个SSLEngine ,它只处理 SSL / TLS协议而不网络(或其他! )I / O.然后,您自己阅读并撰写Socket
,发送SocketChannel
已包含的数据'并将收到的数据提供给'展开'。
有关概述,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLEngine,其中包含部分示例代码 - 适用于客户端;您需要使用peer-identity提示将SSLEngine
更改为setUseClientMode
并将更改为来修改此设置。 (SSL / TLS客户端必须(缓存并)按服务器标识选择已保存的会话,但服务器只使用先前分配的会话ID并记住客户端。)
然后在https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLEngine.html或您最喜欢的JDK / IDE中查看false
类的javadoc(带有非常详细的介绍)。
或者Java SSLEngine example有一些已经做过示例的人的链接,但我自己也没有看过它们。
答案 1 :(得分:1)
这样做的标准方法是使用SSLEngine。但该课程认真难以使用。有一些教程,但对于典型的应用程序,使用SSLEngine应该是不可能的。
前段时间我遇到了同样的问题,最后编写了我自己的库。那里有一些例子,当然还有Netty等项目中的代码。但是这两个选项都不健全或者很容易重用。
TLS Channel将SSLEngine包装在ByteBuffer中,并允许像普通的SocketChannel一样使用它。