我有一个应用程序,我需要在其中使用ServerSocketChannel
和SocketChannel
,但是SSLContext
给了我ServerSocketFactory
,它提供了ServerSocket
并接受Socket
中的连接。
谢谢
这样做的标准方法是使用SSLEngine。但是这个类很难使用。有一些教程,但对于典型的应用程序,使用 SSLEngine
应该是不可能的。前段时间我遇到了同样的问题,最终编写了自己的库。有一些例子,当然还有Netty等项目中的代码。但这两种选择都不可靠或易于重用。
TLS 通道将 SSLEngine 包装在 ByteBuffer 中,并允许像普通套接字通道一样使用它。
"基本"JSSE.getSocketFactory
和.getServerSocketFactory
间接创建客户端SSLSocket
,或SSLServerSocket
,而又创建服务器端SSLSocket
,在这两种情况下,子类Socket
(带有一些添加的方法)并以简单的等待样式管理SSL/TLS协议和网络I/O,这对于(大多数)应用程序来说是最简单的。
要使用通道,您必须创建一个仅处理SSL/TLS协议而不处理网络(或其他!H/..然后,您自己读取和写入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示例有一些来自做过示例的人的链接,但我自己没有看过它们。