SSL和SocketChannel

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

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

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

我正在通过一个简单的对象将read_from / writing_to网络逻辑从网络数据的插入和检索中解耦,以便使用SSLEngine而不会生气,但考虑到我不这样做,实现它是非常棘手的。知道SSL协议的内部……

查看Restlet的实现,它可以做你需要的,而且都是关于NIO的。

Restlet Engine Javadoc

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

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

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

TLS Channel是一个简单的库,可以完成这个任务:包装SSLContext(或SSLEngine)并暴露ByteChannel接口,在内部完成繁重的工作。

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

不确定这是否是您正在寻找的,但可能有所帮助…要创建启用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