我有一些代码可以使用 Java NIO 库连接到远程服务器。我编写了代码以通过回调进行异步连接,当主机只是一个普通的 TCP 服务器时,它工作得很好。但是当服务器使用 SSL 时,看来我必须进行一堆修改。我想要做的是仅将 SSL 设置到检查服务器证书是否有效的程度,即由证书颁发机构颁发且未过期。我不想做比这更广泛的事情(比如名称检查)。换句话说,我只想要非常基本的 SSL 行为。此外,我计划在 Android 上运行它,所以我真的不能对外部 keystore 和客户端的所有内容进行大量摸索。我想在应用程序内部做所有我必须做的事情。如果我可以避免任何外部证书文件,那就太好了。
我不知道我到底需要做什么才能继续。我在这里找到了一些 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 文件中应该有什么。我不想一开始就必须有某种 keystore 文件。
我找到了一个名为 Naga 的库,它声称可以实现 SSL 套接字,但它在我设置的 SSL 套接字服务器上不起作用 - 我得到一个异常: sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
对如何进行有什么建议吗?
最佳答案
您需要使用 SSLEngine,
这本身就不是闹着玩的,我不确定它在 Android 上能否正常工作,尽管我愿意接受更正。 SSLEngine
是一个状态机,需要大量的实现。坦率地说,我会忘记它并使用 SSLSockets。
关于java - 如何将 SSL 添加到 NIO 套接字客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18200780/