私の Java プログラムはjava.net.http.HttpClient
(Java 11) でリクエストを送信します。
OpenJDK 11のJREでEclipseで実行しているときに機能します。
カスタム jlinked JRE で、次のエラーが発生します。
java.io.IOException: Received fatal alert: handshake_failure
問題はカスタム JRE にあると思います。
私の 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
正常に動作していることを示すエラーが発生しました。