2

我有一个需要在内部使用的应用程序ServerSocketChannelSocketChannelSSLContext给了我在 sServerSocketFactory中提供ServerSocket和接受连接的应用程序Socket

有什么解决办法吗?谢谢

4

2 回答 2

2

这样做的标准方法是使用 SSLEngine。但是那个类很难使用。周围有一些教程,但对于典型的应用程序,使用 SSLEngine 应该是不可能的。

前段时间我遇到了同样的问题,最终编写了自己的库。那里有一些示例,当然还有像 Netty 等项目中的代码。但是这两个选项都不是健壮的或易于重用的。

TLS 通道将 SSLEngine 包装在 ByteBuffer 中,并允许像普通的 SocketChannel 一样使用它。

于 2017-07-26T17:36:27.547 回答
1

“基本” 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 示例有一些来自做过示例的人的链接,但我自己没有看过它们。

于 2016-06-11T16:39:36.473 回答