13

理想情况下,我只需要一个简单的SSLSocketChannel.

我已经有一个组件可以通过普通方式读取和写入消息SocketChannel,但是对于其中一些连接,我必须通过网络使用 SSL;但是,对这些连接的操作是相同的。

有谁知道免费的SSLSocketChannel实现(使用适当的选择器)或类似的东西?我找到了这个,但是选择器不接受它,因为它的供应商不是 SUN。

我正在通过一个简单的对象将 read_from/writing_to 网络逻辑与网络数据的插入和检索解耦,以便在SSLEngine不生气的情况下使用 a ,但考虑到我不知道的事实,正确实现它真的很棘手SSL协议的内部...

4

4 回答 4

5

Jetty 为其服务器提供了 NIO SSL 实现:SslSelectorChannelConnector。您可能想查看它以了解其功能的详细信息。

还有一篇来自O'Reilly的旧文章(但不错),它解释了有关 NIO + SSL 的详细信息以及示例代码。

于 2009-05-18T18:23:14.060 回答
3

TLS Channel是一个简单的库,可以做到这一点:包装 SSLContext(或 SSLEngine)并公开 ByteChannel 接口,在内部完成繁重的工作。

(免责声明:我是图书馆的主要作者)。

于 2017-07-21T19:20:46.290 回答
0

不确定这是否是您要查找的内容,但可能会有所帮助...要创建启用 SSL/TLS 的服务器套接字,我目前正在使用如下代码(keystore.jks 包含使用的自签名私钥/公钥对用于保护确认)- 客户端有一个类似的信任库,其中包含带有该对公钥的签名证书。

围绕配置进行一些谷歌搜索应该会让你开始。

String keyStorePath = "keystore.jks";
String keyStorePassword = "password";

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore keyStore = new KeyStore();
keyStore.load(new FileInputStream(keyStorePath), keyStorePassword);
keyManagerFactory.init(keyStore, keyStorePassword.toCharArray());

sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());

SSLContext sslContext = getServerSSLContext(namespace.getUuid());
SSLServerSocketFactory serverSocketFactory = sslContext.getServerSocketFactory();

// Create sockets as necessary
于 2009-05-18T12:39:03.520 回答
0

查看 Restlet 的实现,它可以满足您的需求,而这一切都与 NIO 有关。

Restlet 引擎 Javadoc

特别是 HttpClientCall。SetProtocol(HTTPS) - getResponseEntityChannel 返回一个 ReadableByteChannel(getEntityChannel 返回一个 WriteableByteChannel)

于 2009-05-19T23:18:43.103 回答