首页 > 解决方案 > 使用 OpenJDK 14 java 模块运行时时 TLS 1.3 握手失败

问题描述

这是我的第一篇文章。请善待。我搜索了很多网站,但没有任何运气。

我创建了一个使用 Java 14.0.2 和 JavaFX 14.0.2 开发的简单 Java 应用程序,它使用 TLS 连接到主机并向用户提供基本证书和协议信息。它是一种学习以及测试和故障排除工具。

当使用 Intellij 或使用 OpenJDK 14 GA 版本的 java.exe 运行应用程序并指定应用程序 jar 的类路径时,所有版本的 TLS 都可以工作,包括 TLS 1.3。

我的问题是 TLS 1.3 在构建模块、使用 Jigsaw 的 JLink 和使用 Java 运行时 (JRT) 时不起作用。TLS 1.0 和 1.2 工作正常。TLS 1.3 因握手失败而失败。

我认为问题与支持的组或仅在使用 JRT 时在 Client Hello 中发送的签名算法有关。

当使用 GA 版本的 Java 和应用程序 jar 时,客户端发送 10 个支持的组,即椭圆曲线组 (ECDHE) 和有限域组 (DHE)。它还发送 16 种签名算法(包括 ECDSA 算法)。

使用 JRT 时,客户端发送五个支持的组,其中只有 DHE 组。它还发送 14 种签名算法(不包括 ECDSA 算法)。

我不确定这是否是由于我的模块信息中缺少 require 或者它是否是一个错误。项目中只有一个模块,模块信息非常基础。构建项目时没有错误/警告,并且除了 javax.net.ssl.SSLHandshakeException 之外没有运行时错误。

这是我的模块信息.java:

module TlsHostInfo {
    requires java.base;
    requires javafx.controls;
    requires javafx.fxml;

    opens certpackage.view to javafx.fxml;
    exports certpackage;
}

我希望我错过了什么,或者这是一个简单的配置错误。有没有人遇到过这种情况,您是否看到什么可能导致客户端 Hello 中的数据丢失?

Wireshark 跟踪 1:

Wireshark 跟踪 2:

Wireshark 跟踪 3:

Wireshark 握手失败:

标签: javasslmodule

解决方案


在构建自定义运行时时,SunEC 提供程序似乎需要支持 TLS 1.3。

在“module-info.java”中添加了“需要 jdk.crypto.ec”。

module TlsHostInfo {
    requires java.base;
    requires javafx.controls;
    requires javafx.fxml;
    **requires jdk.crypto.ec;**

    opens certpackage.view to javafx.fxml;
    exports certpackage;
}

推荐阅读