有什么办法可以在ServerSocketChannel中使用SSLContext?
我有一个应用程序,我需要使用ServerSocketChannel
和SocketChannel
,但SSLContext
给我ServerSocketFactory
它给出ServerSocket
并接受Socket
s连接。
任何解决方案?感谢有什么办法可以在ServerSocketChannel中使用SSLContext?
“基本” 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与做过示例的人有一些联系,但我没有亲自看过他们。
这样做的标准方法是使用SSLEngine。但是那个级别的认真很难使用。有一些教程,但对于典型的应用程序,使用SSLEngine应该不成问题。
前段时间我遇到了同样的问题,最后写了我自己的库。这里有一些例子,当然也有像Netty这样的项目中的代码等等。但是这两个选项都不健壮或不易重复使用。
TLS Channel将SSLEngine包装在ByteBuffer中,并允许像使用普通SocketChannels一样使用它。