有没有办法在ServerSocketChannel中使用SSLContext?

时间:2016-06-11 11:09:42

标签: java sockets ssl serversocket sslcontext

我有一个应用程序,我需要在其中使用ServerSocketChannelSocketChannel,但是SSLContext给了我ServerSocketFactory,它提供ServerSocket并接受Socket中的连接{1}} s。

任何解决方案?感谢

2 个答案:

答案 0 :(得分:1)

'基本' JSSE .getSocketFactory.getServerSocketFactory间接创建客户端SSLSocketSSLServerSocket,后者又创建服务器端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一样使用它。