Java не доверяет сертификату
PKIX path building failed, unable to find valid certification path to requested target: у Java своё хранилище доверенных сертификатов, и корневого сертификата в нём нет. Как добавить.
Что это значит
Приложение на Java (Elasticsearch, Logstash, Keycloak, Jenkins и другие) подключается по TLS и не может построить цепочку от сертификата сервера до доверенного корня. У Java собственное хранилище доверенных сертификатов, файл cacerts. Корневой сертификат вашего удостоверяющего центра туда сам не попадает, даже если в системе он установлен.
Вторая причина та же, что у других клиентов: сервер отдаёт только свой сертификат без промежуточных.
Похожая ошибка java.security.cert.CertificateException: Incomplete data означает повреждённый файл сертификата. Чаще всего в нём обрезана последняя строка -----END CERTIFICATE-----.
Как проверить
openssl s_client -connect <адрес>:443 -showcerts </dev/null
keytool -list -cacerts -storepass changeit | grep -i <имя центра>
grep -c "BEGIN CERTIFICATE" chain.pem; grep -c "END CERTIFICATE" chain.pem
Числа в последней строке должны совпадать.
Что сделать
- Добавить корневой сертификат в хранилище Java:
keytool -importcert -cacerts -storepass changeit -alias my-root-ca -file root-ca.crt -noprompt
- Если приложение использует своё хранилище (ключи
javax.net.ssl.trustStoreв настройках запуска), добавлять нужно в него. - В контейнере хранилище внутри образа: добавить сертификат при сборке или смонтировать готовый файл хранилища.
- Перезапустить приложение: хранилище читается при старте.
- Проверить, что сервер отдаёт полную цепочку.