【问题标题】:How to find why a Java 8 app is not defaulting to TLSv1.2?如何找出 Java 8 应用程序未默认使用 TLSv1.2 的原因?
【发布时间】:2021-11-25 23:38:36
【问题描述】:

我正在寻找一个用于对服务进行 REST API 调用的应用程序(已经开发)。这会导致致命错误,在调试时使用 tcpdump 显示请求使用的是 TLSv1.0,而服务期望使用 v1.2。
此应用程序在 Java 8 上运行,根据 jre 文档,在 Java 8 中,TLS 应该默认为 TLSv1.2。

为什么应用程序不使用 TLSv1.2 发送请求,我该如何调试它?我应该只在 java 参数中传递 https.protocol 选项吗?

谢谢! PS:我对 Java 还很陌生。

【问题讨论】:

  • 你在哪个版本的 JDK 上运行?
  • 系统属性https.protocols(带有s或被忽略)可以在命令行或代码中设置,但仅影响使用HttpsURLConnection或在某些情况下Apache httpclient的连接;这就是你的代码的作用吗?对于所有代码方法jdk.tls.client.protocols可以用作默认值。
  • @OldProgrammer JDK 1.8.
  • @dave_thompson_085 为什么即使是 JDK 1.8 应用程序也没有使用默认的 1.2?
  • 可能是您使用的应用程序或库、其他代码、JVM 配置或环境。根据您未提供的信息,可能有数千种可能性。查找minimal example that shows the problem,如果您在此过程中没有发现问题,请添加到您的Q。起点可能是一个仅包含SSLSocket s = (SSLSocket) SSLSocketFactory.getDefault().createSocket(yourhost,yourport);System.out.println (Arrays.toString (s.getEnabledProtocols()));s.startHandshake();的类

标签: java tls1.2


【解决方案1】:

您可以通过添加 javax.net.debug 参数来调试 TLS 握手:

java  -Djavax.net.debug=all -jar yourapp.jar

Debugging SSL/TLS Connections中建议的那样

【讨论】:

  • 这将显示/确认已完成(或尝试)什么握手,但不会显示/确认代码或配置中的什么导致它。
  • 我看到该应用在 tcpdump 的帮助下使用 TLSv1.0,但为什么它不默认为 1.2 是个问题
  • 跟踪日志跟踪可以帮助您确定哪一方(客户端或服务器)正在回退到 TLS 1.0,以及原因。
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2016-10-21
相关资源
最近更新 更多