java.net.http.HttpClient
我的 Java 程序通过(Java 11)发送请求。
当我在 OpenJDK 11 的 JRE 上的 Eclipse 中运行它时,它可以工作。
在自定义 jlinked JRE 上,我收到一个错误:
java.io.IOException: Received fatal alert: handshake_failure
我想问题出在我的自定义 JRE 上。
java.net.http.HttpClient
我的 Java 程序通过(Java 11)发送请求。
当我在 OpenJDK 11 的 JRE 上的 Eclipse 中运行它时,它可以工作。
在自定义 jlinked JRE 上,我收到一个错误:
java.io.IOException: Received fatal alert: handshake_failure
我想问题出在我的自定义 JRE 上。
TL;DR jlinkjdk.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
错误,这表明它工作正常。