链接的JRE中的“收到的致命警报:handshake_failure”

jan*_*ski 2 java jlink sslhandshakeexception

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

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

在自定义Jlink JRE上,出现错误:

java.io.IOException: Received fatal alert: handshake_failure
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*esh 6

没有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
Run Code Online (Sandbox Code Playgroud)

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

当我使用以下方法创建jlink jre时:

jlink --module-path . --add-modules java.base --output jlinked
Run Code Online (Sandbox Code Playgroud)

并运行:jlinked/bin/java使用一个测试TLS应用程序,我得到了错误:Received fatal alert: handshake_failure,这与OP的问题相同。

当我添加时:

jlink --module-path . \
    --add-modules java.base \
    --add-modules jdk.crypto.ec \
    --output jlinked
Run Code Online (Sandbox Code Playgroud)

然后重新运行,我遇到了PKIX path building failed错误,这表明它运行正常。