这是我的第一篇文章。请客气。我搜索了很多站点,但没有任何运气。
我创建了一个使用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中缺少数据?
答案 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;
}