如何将SSL添加到NIO套接字客户端?

时间:2013-08-13 04:37:38

标签: java ssl nio

我有一些代码可以使用Java NIO库连接到远程服务器。我编写了与回调异步连接的代码,当主机只是普通的TCP服务器时,它运行良好。但是当服务器使用SSL时,似乎我必须进行一些修改。我想要做的只是将SSL设置为检查服务器证书是否有效,即由证书颁发机构颁发但未过期的点。我不想做任何比这更广泛的事情(比如名字检查)。换句话说,我只想要非常基本的SSL行为。另外,我计划在Android上运行它,所以我真的不能在外部密钥库和客户端的所有内容上做很多工作。我想在内部对应用程序执行所有操作。如果我可以避免任何外部证书文件那么棒。

为了继续下去,我到底需要做些什么。我在这里找到了一些NIO套接字设置代码,如下所示:

private void setupSecurity() {
    SecureRandom secureRandom = new SecureRandom();
    secureRandom.nextInt();

    KeyStore clientKeyStore = KeyStore.getInstance("JKS");
    clientKeyStore.load(new FileInputStream("client.jks"), "KeyStorePassword".toCharArray()); 

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(clientKeyStore);

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(clientKeyStore, "KeyInKeystorePassword".toCharArray());

    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom);
}

在此之后,有一堆显然可怕的SSL手动代码必须手动实现。上面代码的问题是我不知道我应该在client.jks文件中有什么。我不想要开始使用某种密钥库文件。

我找到了一个名为Naga的库声称实现了SSL套接字,但它在我设置的SSL套接字服务器上不起作用 - 我得到一个例外: sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径

有关如何进行的任何建议?

2 个答案:

答案 0 :(得分:1)

你需要使用SSLEngine,本身并不开玩笑,我不确定它在Android上是否正常工作,尽管我愿意纠正。 SSLEngine是一个状态机,需要大量实现。坦率地说,我会忘记它并使用SSLSockets.

答案 1 :(得分:-3)

这在前面已经讨论过:SSH library for Java

我最终使用了Java Secure Channel (JSCH),其中记录了JSCH javadoc