8

私の Java プログラムはjava.net.http.HttpClient(Java 11) でリクエストを送信します。

OpenJDK 11のJREでEclipseで実行しているときに機能します。

カスタム jlinked JRE で、次のエラーが発生します。

java.io.IOException: Received fatal alert: handshake_failure

問題はカスタム JRE にあると思います。

4

1 に答える 1

14

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_failureOPの問題と同じです。

私が追加したとき:

jlink --module-path . \
    --add-modules java.base \
    --add-modules jdk.crypto.ec \
    --output jlinked

再実行すると、PKIX path building failed正常に動作していることを示すエラーが発生しました。

于 2019-02-20T11:29:15.717 に答える