【问题标题】:How to accelerate tls negotiation in JAVA?如何在 JAVA 中加速 tls 协商?
【发布时间】:2018-02-07 03:04:21
【问题描述】:

有一个私人网络服务器(支持 https),我需要经常在其上读取/设置一些信息。我做了一些java代码来自动完成。当我使用 Chrome 访问它时,第一次连接很慢(可能 5 秒)但连续连接很快(大约 1S)。使用我的 java 代码,每次都很慢。我知道问题是在与我的代码的每次连接中都会执行完整的 TLS 握手。我的问题是,Chrome 做了什么来让它更快,我如何在我的代码中模拟它?以下是我的部分代码:

    class MyTrust implements X509TrustManager{
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
        public X509Certificate[] getAcceptedIssuers() {return null; }   
    }

在另一个建立连接的类中:

    URLConnection conn = (HttpsURLConnection) url.openConnection();
    SSLContext sc = SSLContext.getInstance("TLS");
    sc.init(null, new TrustManager[] { new MyTrust() }, new java.security.SecureRandom());
    ((HttpsURLConnection) conn).setSSLSocketFactory(sc.getSocketFactory());

我正在阅读Java Secure Socket Extension (JSSE) Reference Guide,但发现它很难理解。是 SessinID 还是 Principal 有效?谁能给我一些提示?

【问题讨论】:

  • 您的 java 代码需要超过 5 秒才能完成一次 TLS 握手?
  • 不“超过”,或多或少 5 秒。但我不在乎第一次连接所消耗的时间。我的观点是如何跳过每次连接的完全握手。

标签: java performance ssl tls1.2 httpsurlconnection


【解决方案1】:

您的 java 代码每次都会建立连接,因此每次都会执行 TLS 握手。

但是浏览器(例如 Chrome)会尝试保持连接(通过在请求中添加 Connection:Keep-Alive 标头),如果服务器接受保持连接(通过在响应中返回 Connection:Keep-Alive 标头),大多数服务器都会这样做,浏览器会尝试对正在进行的请求使用相同的连接,因此不需要每次都执行 TLS 握手。

对于您的 java 代码,您可以将连接存储在一个池中,并重复使用它。可以查看Apache HttpComponents,支持http连接池

由 cmets 编辑:

因为真正的问题在于 SSL/TLS 会话重用不起作用。我怀疑这是由于滥用 JSSE 造成的。您必须在每个连接上使用相同的 SSLContext 以启用会话重用。此外,由于连接上的一些错误操作(例如读取流的末尾),会话可能会被丢弃。这里列出了一些细节:How to enable client TLS session reuse in Java

【讨论】:

  • 服务器不支持keep-alive连接。我们自己实现它。标准 JAVA api 是否支持 SessinID 的缓存和重用?
  • ssl/tls 会话重用在 JSSE 中默认实现和启用,我怀疑您的问题是由其他原因引起的。您是否在每个连接上都构造了一个新的 SSLContext?您必须在每个连接上使用相同的 SSLContext 以启用会话重用。此外,由于连接上的一些错误操作(例如读取流的末尾),会话可能会被丢弃。这里列出了一些细节:stackoverflow.com/questions/27312522/…
  • 相同的 SSLContext。也许这是问题,因为默认情况下会话是可重用的。我会仔细检查并考虑我的代码。谢谢。
  • 我创建了多个 SSLContext 对象。现在问题已经解决了。谢谢~
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2018-07-25
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多