我有一个需要在内部使用的应用程序ServerSocketChannel
,SocketChannel
但SSLContext
给了我在 sServerSocketFactory
中提供ServerSocket
和接受连接的应用程序Socket
。
有什么解决办法吗?谢谢
2 回答
这样做的标准方法是使用 SSLEngine。但是那个类很难使用。周围有一些教程,但对于典型的应用程序,使用 SSLEngine 应该是不可能的。
前段时间我遇到了同样的问题,最终编写了自己的库。那里有一些示例,当然还有像 Netty 等项目中的代码。但是这两个选项都不是健壮的或易于重用的。
TLS 通道将 SSLEngine 包装在 ByteBuffer 中,并允许像普通的 SocketChannel 一样使用它。
“基本” JSSE.getSocketFactory
并.getServerSocketFactory
间接创建 client-side SSLSocket
,或者SSLServerSocket
反过来创建 server-side 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
而不使用 peer-identity 提示来修改它。(SSL/TLS 客户端必须(缓存和)通过服务器身份选择保存的会话,但服务器只使用它先前分配的会话 ID 和客户端记住。)
然后在https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLEngine.html或您最喜欢的 JDK/IDE 中查看SSLEngine
该类的 javadoc(具有异常详细的介绍) 。
或者Java SSLEngine 示例有一些来自做过示例的人的链接,但我自己没有看过它们。