【问题标题】:How to get Cipher used by an HTTPS Connection如何获取 HTTPS 连接使用的密码
【发布时间】:2017-09-25 13:42:16
【问题描述】:

如何在 Java 中获取 HTTPS 连接使用的密码?在使用以下代码点击 URL 后,我需要找到使用的 TLS 版本,无论是 TLS 1.1 还是 1.2:

url = new URL(https_url);
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();

Firefox 浏览器的屏幕截图如下。 任何人都可以帮助我得到这个吗? TLS Version

我试过了

SSLSocket socket = (SSLSocket) con.getSSLSocketFactory().createSocket();
String[] test = socket.getSSLParameters().getProtocols();

但这给出了为连接启用的协议列表。我需要服务器响应中使用的协议。

随附的屏幕截图显示了我希望阅读的内容(TLS 1.2)

【问题讨论】:

    标签: java ssl tls1.2


    【解决方案1】:

    我认为con.getCipherSuite(); 应该可以解决算法问题...

    https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HttpsURLConnection.html

    这对于 tls 来说可能是一个奇怪的解决方案,但如果你设法打开一个新的 SSL 套接字(也许你可以用socket.close(); 关闭) SSLSocket socket = (SSLSocket) con.getSSLSocketFactory().createSocket(); String[] test = socket.getSSLParameters().getProtocols(); 在测试值中注意:您可以获得可用的 TLS 版本,而不仅仅是一个。

    【讨论】:

    • 谢谢,我怎样才能获得 TLS 版本呢?由于 con.getCipherSuite() 仅返回 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。我需要获取 TLS 版本,因为在这种情况下它是 1.2。如果显示 TLS 版本,我可以解析它
    • 这可能是一个奇怪的解决方案,但如果你设法打开一个新的 SSL 套接字(也许你可以关闭) SSLSocket socket = (SSLSocket) con.getSSLSocketFactory().createSocket(); String[] test = socket.getSSLParameters().getProtocols();在测试值中请注意:您可以获得可用的 TLS 版本,而不仅仅是一个。
    • SSLSocket 套接字 = (SSLSocket) con.getSSLSocketFactory().createSocket(); String[] test = socket.getSSLParameters().getProtocols();将给出为连接启用的协议列表。但我需要打开所需页面后返回的那个。
    【解决方案2】:
    1. 在连接之前在HttpsURLConnection 上安装自定义SSLSocketFactory,或在连接时执行任何I/O。
    2. 安排您的SSLSocketFactory 可以返回最近创建的SSLSocket,或者实际上是全部。
    3. 连接后,或在连接上完成任何 I/O,从SSLSocketFactory 检索相关的SSLSocket,并从当前SSLSession 获取当前密码。请注意,将SSLSockets 与HttpsURLConnections 关联起来并非易事,因为存在连接池和HTTP keep-alive。

    【讨论】:

      【解决方案3】:

      您可以使用以下命令打印协议 (TLSv1.2) 和套件 (TLS_ECDHE_RSA_WITH_AES):

      SSLSocket ss = (SSLSocket) SSLSocketFactory.getDefault().createSocket("host", 443);
      System.out.println("protocol: "+ss.getSession().getProtocol());
      System.out.println("suite:    "+ss.getSession().ss.getSession().getCipherSuite());
      

      【讨论】:

      • 您可以获取创建新 TLS 连接时创建的新 TLS 会话的 TLS 协议。不能保证会话是一样的,或者协议..
      • @EJP 实际上,您只能获得当前会话的那个。也可以重新协商。浏览器也只显示“当前”会话。
      • 您只能获取当前会话的当前会话,并且不能保证这对于感兴趣的 实际 会话是正确的。而且你要么泄漏了套接字,要么浪费了额外的连接。
      • @EJP 这只是获取信息的 sn-p。没有人愿意打开新的连接。如果有人想将此信息拉到 URLConnection,使用池连接无法保证(也不会重新协商连接)
      猜你喜欢
      • 2013-09-24
      • 2014-01-21
      • 2019-10-19
      • 2016-03-12
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多