java - 如何在 Java 中启用客户端 TLS session 重用

标签 java ssl jsse

<分区>

我有一个 Java 客户端,它可以为同一台服务器创建多个 session 。 TLS 协议(protocol)具有缓存 session key 的功能,从而避免为每个连接进行昂贵的 PKI 处理。但我无法让它真正起作用。

openssl s_client -reconnect -state -prexit -connect localhost:1234 报告服务器具有“已重用,TLSv1/SSLv3,密码为 ECDHE-RSA-AES256-SHA384”,以及相同的主 key 。

数据流是二进制的,不是HTTP封装的。

我使用的代码(大约)如下。它有效,但没有 session 重用。

    initSSLContext(keyStore, "password", trustStore, "PKIX", "TLSv1");

While (true) {

    connect(); 

    byte[] encode1 = { 0x42, 0, 0, 0, 0, 0, 0, 0, 0, };
    outs.write(encode1);
    byte[] ttlbuf = new byte[10000];
    int len = ins.read(ttlbuf, 0, ttlbuf.length);
    StringBuilder sb = new StringBuilder();
    socket.close();
}

private void initSSLContext(KeyStore keyStore, String keyStorePwd, KeyStore trustStore,
        String sslTrustManagerAlg, String sslProtocol) throws Exception {
    KeyManager[] keyManagers = null;

    if ( keyStore != null && keyStorePwd != null ) {
        KeyManagerFactory kmf = 
           KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, keyStorePwd.toCharArray());
        keyManagers = kmf.getKeyManagers();
    }

    TrustManager[] trustManagers = null;
    if ( trustStore != null ) {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(sslTrustManagerAlg);
        tmf.init(trustStore);
        trustManagers = tmf.getTrustManagers();
    }

    ctx = SSLContext.getInstance(sslProtocol);
    ctx.init(keyManagers, trustManagers, null);

    factory = ctx.getSocketFactory();
}

private void connect() throws IOException {
    socket = (SSLSocket) factory.createSocket(host, port);
    socket.setSoTimeout(30000);
    // ensure first ClientHello is TLSv1 rather than SSLv2
    socket.setEnabledProtocols(new String[] { "TLSv1" });
    socket.setEnabledCipherSuites(DEFAULT_SSL_CIPHER_SUITES);
    localHost = socket.getLocalAddress().getHostAddress();
    localPort = socket.getLocalPort();
    ins = socket.getInputStream();
    outs = socket.getOutputStream();
 }

最佳答案

问题是任何致命警报都会终止 session 恢复。因此,阅读一个流的末尾会杀死后续的重用。这里还有更多

Java TLS Session Reuse after closed connection

关于java - 如何在 Java 中启用客户端 TLS session 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312522/

上一篇:java - 推送通知 - 由 : java. io.IOException 引起:toDerInputStream 拒绝标记类型 45

下一篇:ASP.net WebRequest 内部 SSL 协议(protocol)?

相关文章:

java - 如何在 java 的 ssl session 中获取主 key ?

java - 公共(public) https 网站上的 jsse handshake_failure

java - 如何在特定连接上使用不同的证书?

java - 如何将 jndi 查找从 xml 转换为 java 配置

java - 可执行jar看不到图像

java - 面向对象编程语言的 AST(抽象语法树)是什么样的?

java - MySQL - Java SSL 连接抛出错误

java - 输出大量数据最快的方法是什么?

node.js - 在 Node 服务器上安装 SSL 证书

php - laravel 或 AWS 没有检测到我的 https