【问题标题】:How to get Used protocol SSL or TLS of which version如何获取使用的协议 SSL 或 TLS 的哪个版本
【发布时间】:2018-05-10 07:30:29
【问题描述】:

我们正在使用以下代码来构建 HTTP 客户端套接字工厂:

    SSLContext sslContext = new SSLContextBuilder().build();     
    sslContext.init(null, getTrustAllCertsManager(), new java.security.SecureRandom());
    final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    sslsf.createSocket(null);

HTTPClient 的版本是 4.5.1 。由于我对此非常陌生,并且我们的一个客户正在迁移到 TLSv1.2 并且不支持 TLSv1.0,我如何确保上述代码将支持 TLSv1.1、TLSv1.2。如果我通过代码默认协议是 TLS 并且我们没有传递任何此类参数,例如 TLSv1.1 或 TLSv1.2。这些协议的东西是从哪里驱动的。如果我需要更改代码以支持 TLSv1.1、TLSv1.2 并停止支持 TLSv1.0,我需要在我的代码中进行哪些更改。谢谢。

【问题讨论】:

标签: java ssl apache-httpclient-4.x tls1.2


【解决方案1】:

HttpClient context logging 将提供相当数量的 SSL 会话详细信息

[DEBUG] MainClientExec - Opening connection {s}->https://httpbin.org:443
[DEBUG] DefaultHttpClientConnectionOperator - Connecting to httpbin.org/52.1.117.85:443
[DEBUG] SSLConnectionSocketFactory - Connecting socket to httpbin.org/52.1.117.85:443 with timeout 0
[DEBUG] SSLConnectionSocketFactory - Enabled protocols: [TLSv1, TLSv1.1, TLSv1.2]
[DEBUG] SSLConnectionSocketFactory - Enabled cipher suites:[TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
[DEBUG] SSLConnectionSocketFactory - Starting handshake
[DEBUG] SSLConnectionSocketFactory - Secure session established
[DEBUG] SSLConnectionSocketFactory -  negotiated protocol: TLSv1.2
[DEBUG] SSLConnectionSocketFactory -  negotiated cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[DEBUG] SSLConnectionSocketFactory -  peer principal: CN=httpbin.org
[DEBUG] SSLConnectionSocketFactory -  peer alternative names: [httpbin.org, www.httpbin.org]
[DEBUG] SSLConnectionSocketFactory -  issuer principal: CN=Let's Encrypt Authority X3, O=Let's Encrypt, C=US
[DEBUG] DefaultHttpClientConnectionOperator - Connection established 192.168.43.64:58742<->52.1.117.85:443

另请注意,从 4.4 版起,HttpClient 默认禁用 SSLv3 和较旧的 SSL 协议版本。

【讨论】:

  • 谢谢@oleg.. 另外我找到了另一种获取详细信息的方法,即在 java opts 中使用“-Djavax.net.debug=all”。它将打印所有套接字和客户端服务器握手细节。
  • 这当然可行,但完整的 SSL 会话调试模式往往会产生一些可能难以解析的输出日志。 HttpClient 只提供了关于 SSL 会话的最重要的部分
【解决方案2】:

除了 oleg 建议的答案外,我们可以在 java_opts 中添加“-Djavax.net.debug=all”,这将导致打印所有套接字日志以及协议版本。它将打印许多详细信息,您可以在其中找到相关的信息,就像在我的情况下,我通过以下日志找到了协议详细信息。

READ: TLSv1.1 Handshake
WRITE: TLSv1.1 Handshake

【讨论】:

    【解决方案3】:

    要调试 SSL 握手并显示 TLS 版本,请使用“javax.net.debug”属性设置为 all。

    例如,可以通过在 main 方法上添加此属性来检查日志,然后再进行任何 http 调用。所有信息都将打印在控制台上。

     public static void main(String[] args) {
            System.setProperty("javax.net.debug", "all");
            anyHttpClient.function(); // here anyHttpClinet can be restTemplate or any http client
    }
    

    运行 main 方法后,您可以看到如下打印的日志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 2017-04-28
      • 2014-02-02
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多