Вопрос-ответ

Error - trustAnchors parameter must be non-empty

Ошибка - параметр trustAnchors должен быть непустым

Я пытаюсь настроить свою электронную почту на Jenkins / Hudson, и я постоянно получаю сообщение об ошибке:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
non-empty

Я видел в Интернете много информации об ошибке, но я не получил ни одной для работы. Я использую JDK от Sun в Fedora Linux (не OpenJDK).

Вот несколько вещей, которые я пробовал. Я пытался следовать советам из этого поста, но копирование cacerts из Windows на мой Fedora box, на котором размещен Jenkins, не сработало. Я пытался следовать этому руководству, поскольку я пытаюсь настроить Gmail в качестве своего SMTP-сервера, но это тоже не сработало. Я также пытался загрузить и переместить эти файлы cacert вручную и переместить их в свою папку Java, используя варианты команд из этого руководства.

Я открыт для любых предложений, поскольку в данный момент я застрял. Я заставил его работать с Windows Hudson server, но у меня проблемы с Linux.

Переведено автоматически
Ответ 1

Это странное сообщение означает, что указанное вами хранилище доверия было:


  • пустой,

  • не найден, или

  • не удалось открыть, например, из-за:

    • неверно / отсутствует trustStorePassword, или

    • права доступа к файлам.



Смотрите также Ответ @AdamPlumb ниже.

Ответ 2

В Ubuntu 18.04 у этой ошибки другая причина (JEP 229, переключение с формата jks хранилища ключей по умолчанию на формат pkcs12, и генерация файла Debian cacerts с использованием формата по умолчанию для новых файлов) и обходной путь:

# Ubuntu 18.04 and various Docker images such as openjdk:9-jdk throw exceptions when
# Java applications use SSL and HTTPS, because Java 9 changed a file format, if you
# create that file from scratch, like Debian / Ubuntu do.
#
# Before applying, run your application with the Java command line parameter
# java -Djavax.net.ssl.trustStorePassword=changeit ...
# to verify that this workaround is relevant to your particular issue.
#
# The parameter by itself can be used as a workaround, as well.

# 0. First make yourself root with 'sudo bash'.

# 1. Save an empty JKS file with the default 'changeit' password for Java cacerts.
# Use 'printf' instead of 'echo' for Dockerfile RUN compatibility.
/usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts

# 2. Re-add all the CA certs into the previously empty file.
/var/lib/dpkg/info/ca-certificates-java.postinst configure

Статус (2018-08-07), ошибка исправлена в Ubuntu Bionic LTS 18.04.1 и Ubuntu Cosmic 18.10.


🗹 Ubuntu 1770553: [SRU] серверный центр сертификации-java от cosmic (20180413ubuntu1)

🗹 Ubuntu 1769013: Пожалуйста, объедините ca-сертификаты-java 20180413 (main) из нестабильного Debian (main)

🗹 Ubuntu 1739631: при новой установке с JDK 9 не удается использовать сгенерированный файл хранилища ключей PKCS12 cacerts

🗹 библиотека docker 145: 9-в образе jdk проблемы с SSL

🗹 Debian 894979: ca-сертификаты-java: не работает с OpenJDK 9, приложения завершаются сбоем с InvalidAlgorithmParameterException: параметр trustAnchors должен быть непустым

🗹 JDK-8044445: JEP 229: Создайте хранилища ключей PKCS12 по умолчанию

🖺 JEP 229: создайте хранилища ключей PKCS12 по умолчанию


Если проблема не исчезнет после этого обходного решения, возможно, вам захочется убедиться, что вы действительно используете дистрибутив Java, который вы только что исправили.

$ which java
/usr/bin/java

Вы можете установить для альтернатив Java значение "auto" с помощью:

$ sudo update-java-alternatives -a
update-alternatives: error: no alternatives for mozilla-javaplugin.so

Вы можете дважды проверить версию Java, которую вы выполняете:

$ java --version
openjdk 10.0.1 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)

Также существуют альтернативные обходные пути, но у них есть свои побочные эффекты, которые потребуют дополнительного обслуживания в будущем без какой-либо отдачи.

Следующий лучший способ решения проблемы - добавить строку

javax.net.ssl.trustStorePassword=changeit

для файлов

/etc/java-9-openjdk/management/management.properties
/etc/java-11-openjdk/management/management.properties

в зависимости от того, что существует.

Третий наименее проблемный способ решения проблемы - изменить значение

keystore.type=pkcs12

Для

keystore.type=jks

в файлах

/etc/java-9-openjdk/security/java.security
/etc/java-11-openjdk/security/java.security

независимо от того, что существует, а затем удалите cacerts файл и повторно создайте его способом, описанным в последней строке сценария обхода в верхней части сообщения.

Ответ 3

Это устранило проблему для меня в Ubuntu:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

(найдено здесь: https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760)

ca-certificates-java не является зависимостью в Oracle JDK / JRE, поэтому он должен быть установлен явно.

Ответ 4

В Ubuntu 18.04 основной причиной является конфликт между openjdk-11-jdk (который используется по умолчанию) и другими зависящими от него пакетами. Это уже исправлено в Debian и вскоре будет включено в Ubuntu. Между тем, самый простой обходной путь - понизить уровень вашей java до версии 8. Другие решения, использующие ca-certificates-java, намного сложнее.

Сначала удалите конфликтующие пакеты:

sudo apt-get remove --purge openjdk* java-common default-jdk
sudo apt-get autoremove --purge

Проверьте, успешно ли вы удалили все связанные пакеты с помощью:

sudo update-alternatives --config java

Система выдаст вам запрос для настройки недоступна Java, в противном случае это обходное решение завершается неудачей.

Затем переустановите необходимые пакеты:

sudo apt-get install openjdk-8-jdk
java