java - jlinked JRE 中的 "Received fatal alert: handshake_failure"

标签 java sslhandshakeexception jlink

我的 Java 程序通过 java.net.http.HttpClient 发送请求(Java 11)。

当我在 OpenJDK 11 的 JRE 上的 Eclipse 中运行它时,它可以工作。

在自定义 jlinked JRE 上,我收到一个错误:

java.io.IOException: Received fatal alert: handshake_failure

我想问题出在我的自定义 JRE 上。

最佳答案

TL;DR jlink 没有 jdk.crypto.ec无法与具有椭圆曲线证书的服务器通信。你会得到一个 handshake_failure尝试与运行此服务器的服务器通信时出错。

构建可部署 jre 时,如果不包含 jdk.crypto.ec模块,那么它将无法与只有椭圆曲线证书的服务器通信。我使用以下方法模拟了一个:

out_dom=localhost
subj="/C=IE/CN=localhost"
openssl ecparam -name secp384r1 -genkey \
    -out $out_dom.key
openssl req -new \
    -subj "$subj" \
    -key $out_dom.key \
    -out $out_dom.csr
openssl req -x509 -nodes \
    -days 365 \
    -key $out_dom.key \
    -in $out_dom.csr \
    -out $out_dom.crt

当我使用标准 JRE 与此服务器通信时,我收到有关 PKIX path building failed 的错误- 即证书不在 cacerts 文件中。

当我使用以下方法创建 jlink jre 时:
jlink --module-path . --add-modules java.base --output jlinked

并运行:jlinked/bin/java使用测试 TLS 应用程序时,出现错误:Received fatal alert: handshake_failure ,这与OP的问题相同。

当我添加:
jlink --module-path . \
    --add-modules java.base \
    --add-modules jdk.crypto.ec \
    --output jlinked

并重新运行,我经历了PKIX path building failed错误,这表明它工作正常。

关于java - jlinked JRE 中的 "Received fatal alert: handshake_failure",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54770538/

相关文章:

java - 忽略 Servlet 中的 SSL 证书

ssl - 来自 Android 手机的 HTTPS 请求在 3G 和 4G 网络中失败,但在 2G 网络中工作正常

java - 相同的代码,通过 Lotus Domino 发送电子邮件的不同行为

java - Spring Boot 无法监听端口

java - 重载库类构造函数

java - 将秒转换为 H :M:S with "efficiency"

java - 从 Mathematica 调用 ImageJ

java.security.NoSuchAlgorithmException : Algorithm x25519 not available

java - Gradle jlink 插件在 createMergedModule 期间失败,错误为 "the service implementation does not have a default constructor"

java - Apache Derby - 检查数据库是否已创建?