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

标签 java ssl nio

我有一些代码可以使用 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/

相关文章:

ssl - DYMO Web 服务证书错误

java.lang.UnsupportedOperationException : 'posix:permissions' not supported as initial attribute on Windows

android - 支持非阻塞 IO 的 Android HTTP 请求框架

java - 如何删除Windows上的临时文件?

java - 在 JEditorPane 中动态添加 rtf 文件的超链接

java - 将此 json 映射到 java 对象 (pojo)

java - 如何通过组合键的哈希码来计算 Pojo 的哈希码

在 Ubuntu 14.x 上使用虚拟主机配置 Apache2 SSL

c# - 为了通过网络传输数据,序列化是必须的吗?

ssl - "man in the middle"攻击 https 可以读取所有通信吗?