3

我有一些代码可以使用 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: 无法找到有效的证书路径到请求的目标

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

4

2 回答 2

1

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

于 2013-08-13T05:49:51.980 回答
-4

这实际上之前在这里讨论过:用于 Java 的 SSH 库

我最终使用了此处记录的Java 安全通道 (JSCH) : JSCH javadoc

于 2013-08-13T08:52:50.253 回答