我的Java程序通过java.net.http.HttpClient
(Java 11)发送请求。
当我在OpenJDK 11的JRE上的Eclipse中运行它时,它就可以工作。
在自定义链接JRE上,出现错误:
java.io.IOException: Received fatal alert: handshake_failure
我想问题在于我的自定义JRE。
答案 0 :(得分:5)
jdk.crypto.ec
的 TL; DR jlink无法与具有椭圆曲线证书的服务器通信。尝试与运行此服务器的服务器通信时,您会收到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
的错误-即cert不在cacerts文件中。
当我使用以下方法创建jlink jre时:
jlink --module-path . --add-modules java.base --output jlinked
并使用测试的TLS应用运行:jlinked/bin/java
,我得到了错误:Received fatal alert: handshake_failure
,这与OP的问题相同。
添加时:
jlink --module-path . \
--add-modules java.base \
--add-modules jdk.crypto.ec \
--output jlinked
然后重新运行,我遇到了PKIX path building failed
错误,表明它运行正常。