エラーメッセージ
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
別の表記
- javax.net.ssl.SSLException: (internal_error) Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
- the trustAnchors parameter must be non-empty
JDK 25 はこれを「javax.net.ssl.SSLException: (internal_error) Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty」として報告し、原因のチェーンには「java.lang.RuntimeException: Unexpected error: …」が含まれます。トラストストアのパスがそもそも存在しない場合は、代わりに「PKIX path building failed」になります。
Java (JSSE / PKIX) — the trust store the JVM loaded contains no trusted certificates
このエラーの意味
JVM が読み込んだトラストストアに信頼済み証明書のエントリが 1 つもないため、PKIX バリデーターにはトラストアンカーがまったくなく、起動を拒否します。これは、どの証明書のチェックよりも前に起こります。ファイルは存在し、開くこともできますが、TLS の信頼という用途から見ると空です。そのプロセスのすべての HTTPS 接続が同じように失敗します。
発生する理由
キーストアがトラストストアとして設定されている
よくあるjavax.net.ssl.trustStore が指しているファイルに、秘密鍵のエントリ(クライアントまたはサーバー自身の鍵)しかなく、信頼済み証明書のエントリがありません。
JDK の cacerts が空か、置き換えられている
よくある一部のディストリビューションのパッケージは、インストール時にシステムのバンドルから cacerts を生成します。インストール後の処理の失敗、最小構成のコンテナーイメージ、壊れたシンボリックリンクがあると、ストアは空のままになります。
別の目的で作成されたストア
ときどき作成したばかりのストア(keytool -genkeypair の後に -delete したものや、スクリプトで作成した空の PKCS12)で、CA 証明書が一度も追加されていないものです。
修正方法
- 1.
信頼済みエントリの数を数える
keytool -list でエントリを確認できます。トラストストアには trustedCertEntry の行が必要です。JDK のデフォルトのストアと比較してください。
bash # How many trusted certificates does the store hold? (0 reproduces this error) keytool -list -keystore "$TRUSTSTORE" -storepass "$TRUSTSTORE_PASSWORD" | grep -c trustedCertEntry keytool -list -cacerts -storepass changeit | grep -c trustedCertEntry # the JDK's default store - 2.
JDK のデフォルトのトラストストアを復元する
Debian と Ubuntu では、ca-certificates-java を再インストールすると /etc/ssl/certs/java/cacerts が再生成されます。Alpine では java-cacerts パッケージがこのファイルを提供します。
bash # Debian/Ubuntu OpenJDK packages build cacerts from the system CA bundle sudo apt-get install --reinstall ca-certificates-java sudo update-ca-certificates -f # Alpine apk add --no-cache java-cacerts - 3.
キーストアとトラストストアを分ける
自身の証明書と鍵は javax.net.ssl.keyStore として、CA 証明書は javax.net.ssl.trustStore として渡してください。
bash # Key store (your key + certificate) and trust store (CAs you trust) are different files java -Djavax.net.ssl.keyStore=client.p12 -Djavax.net.ssl.keyStorePassword=changeit \ -Djavax.net.ssl.trustStore=truststore.p12 -Djavax.net.ssl.trustStorePassword=changeit -jar app.jar