Сообщение об ошибке
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 загрузила хранилище доверенных сертификатов, в котором нет ни одной записи доверенного сертификата, поэтому у валидатора PKIX вообще нет якорей доверия и он отказывается работать. Это происходит ещё до проверки какого-либо сертификата: файл существует и открывается, но для доверия в TLS он пуст. Все HTTPS-соединения процесса завершаются такой же ошибкой.
Почему это происходит
В качестве хранилища доверенных сертификатов указано хранилище ключей
частоjavax.net.ssl.trustStore указывает на файл, в котором есть только записи закрытых ключей (собственный ключ клиента или сервера) и нет ни одной записи доверенного сертификата.
Файл cacerts в JDK пуст или подменён
частоНекоторые пакеты дистрибутивов при установке генерируют 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