使用OpenJDK 14 Java模块运行时时TLS 1.3握手失败

时间:2020-09-19 03:14:44

标签: java ssl module

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

我创建了一个使用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.3不起作用。 TLS 1.0和1.2可以正常工作。 TLS 1.3因握手失败而失败。

我相信问题仅与使用JRT时在客户端Hello中发送的受支持的组或签名算法有关。

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

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

我不确定这是否是由于我的模块信息中缺少要求或是否是错误。项目中只有一个模块,而module-info是非常基本的。构建项目时,除了javax.net.ssl.SSLHandshakeException之外,没有错误/警告,也没有运行时错误。

这是我的module-info.java:

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

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

我希望我错过了一些东西,或者这是一个简单的配置错误。有没有人碰到这个,您是否看到什么可能导致客户端Hello中缺少数据?

Wireshark Trace 1:

Wireshark Trace 2:

Wireshark Trace 3:

Wireshark Handshake Failure:

1 个答案:

答案 0 :(得分:2)

在构建自定义运行时时,似乎要求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;
}