Что это значит

Приложение на 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

Числа в последней строке должны совпадать.

Что сделать

  1. Добавить корневой сертификат в хранилище Java:
keytool -importcert -cacerts -storepass changeit -alias my-root-ca -file root-ca.crt -noprompt
  1. Если приложение использует своё хранилище (ключи javax.net.ssl.trustStore в настройках запуска), добавлять нужно в него.
  2. В контейнере хранилище внутри образа: добавить сертификат при сборке или смонтировать готовый файл хранилища.
  3. Перезапустить приложение: хранилище читается при старте.
  4. Проверить, что сервер отдаёт полную цепочку.