DevOps

Настройка email в Jenkins: решение ошибки trustAnchors на Linux

Пошаговое руководство по устранению ошибки trustAnchors parameter must be non-empty при настройке электронной почты в Jenkins/Hudson на Linux. Решения для Fedora и других дистрибутивов.

4 ответа 1 просмотр

Ошибка trustAnchors parameter must be non-empty при настройке электронной почты в Jenkins/Hudson на Linux

Я пытаюсь настроить электронную почту в Jenkins/Hudson на Fedora Linux (использую JDK от Sun, а не OpenJDK), но постоянно получаю ошибку:

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

Что уже было предпринято:

  1. Скопировал файл cacerts с Windows на мою Fedora машину с Jenkins - не помогло
  2. Следовал руководству по настройке Gmail как SMTP сервера - не сработало
  3. Попробовал вручную скачать и переместить файлы cacert в папку Java - безуспешно

На Windows сервере Hudson эта настройка работает без проблем.

Вопрос:

Как правильно решить проблему с trustAnchors при настройке электронной почты в Jenkins на Linux? Какие конкретные шаги нужно предпринять для корректной настройки Java trust store в среде Linux?

Ошибка trustAnchors parameter must be non-empty возникает из-за пустого или недоступного Java trust store в Linux. Для решения проблемы в Fedora с Sun JDK необходимо правильно настроить trust store, импортировать сертификаты и перенастроить Jenkins.


Содержание


Понимание ошибки trustAnchors parameter must be non-empty

Ошибка trustAnchors parameter must be non-empty — это распространенная проблема при работе с SSL/TLS соединениями в Java приложениях, включая Jenkins/Hudson. Что на самом деле означает эта ошибка? Она указывает на то, что Java не может найти или использовать доверенные корневые сертификаты (trust anchors) для проверки SSL сертификатов.

В вашем случае, когда вы пытаетесь настроить email в Jenkins, система пытается установить защищенное соединение с SMTP-сервером (например, Gmail), но не может найти действительные корневые сертификаты для проверки подлинности сервера. Это особенно актуально при переносе с Windows на Linux, так как Java trust store на Linux может быть пустым или содержать другой набор сертификатов.

Интересный факт: по умолчанию trust store в JRE Linux занимает всего 32 байта, тогда как на Windows он составляет около 80 КБ. Значительная разница! Именно поэтому копирование cacerts с Windows может не работать должным образом — форматы могут отличаться, или могут отсутствовать необходимые сертификаты.


Основные причины проблемы с trust store в Linux

Почему же возникает эта проблема в Linux системах? Давайте разберем основные причины:

  1. Пустой trust store: В некоторых Linux дистрибутивах, особенно при использовании Oracle JDK (Sun JDK), trust store по умолчанию может быть пустым или содержать минимальный набор сертификатов.

  2. Неправильные права доступа: файл cacerts может иметь неверные права доступа, из-за которых Java не может его прочитать. Проверьте права командой ls -l /usr/lib/jvm/java-*/lib/security/cacerts.

  3. Отсутствие необходимых сертификатов: даже если trust store не пуст, он может не содержать сертификаты, необходимые для работы с конкретными SMTP серверами, особенно если это корпоративные или внутренние серверы.

  4. Проблемы с форматом: trust store может быть в формате PKCS12 вместо JKS, что вызывает проблемы совместимости с Java приложениями.

  5. Конфликт версий JDK: если у вас установлена версия JDK, не включенная в официальные репозитории дистрибутива, могут возникнуть проблемы с путями к сертификатам.

Теперь, когда мы понимаем причины, давайте перейдем к решениям для Fedora Linux.


Решения для Fedora и других дистрибутивов Linux

Решение 1: Установка ca-certificates-java для Oracle JDK

Это самый надежный способ для систем с Oracle JDK (Sun JDK) на Fedora Linux:

bash
# Сначала добавляем репозиторий EPEL
sudo dnf install epel-release

# Устанавливаем ca-certificates-java
sudo dnf install ca-certificates-java

# Конфигурируем сертификаты
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

Важно: ca-certificates-java не является зависимостью Oracle JDK/JRE, поэтому его нужно устанавливать вручную. Этот пакет автоматически настраивает trust store для работы Java приложений.

Решение 2: Копирование и настройка trust store вручную

Если предыдущий метод не сработал, можно попробовать копировать trust store с работающей Windows системы:

bash
# Находим путь к Java на вашей системе
sudo find /usr -name "cacerts" 2>/dev/null

# Копируем файл cacerts с Windows (предположим, он находится на сетевом диске)
sudo cp /mnt/windows/c:/Program\ Files/Java/jre1.8.0_XXX/lib/security/cacerts /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el8_4.x86_64/jre/lib/security/cacerts.bak

# Создаем новую копию для работы
sudo cp /etc/ssl/certs/java/cacerts /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el8_4.x86_64/jre/lib/security/cacerts

Решение 3: Использование альтернативного пути к trust store

Иногда полезно указать явный путь к trust store в конфигурации Jenkins:

bash
# Добавляем переменную окружения для Java
export JAVA_OPTS="-Djavax.net.ssl.trustStore=/path/to/your/cacerts -Djavax.net.ssl.trustStorePassword=changeit"

# Или добавляем в системные настройки
echo "export JAVA_OPTS=\"-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts\"" | sudo tee -a /etc/environment

После внесения изменений обязательно перезапустите Jenkins:

bash
sudo systemctl restart jenkins

Проверка и импорт сертификатов в trust store

Как убедиться, что trust store настроен правильно? Давайте разберем процесс проверки и импорта сертификатов:

Проверка текущего состояния trust store

Сначала проверьте содержимое trust store:

bash
# Замените путь на актуальный для вашей системы
sudo keytool -list -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el8_4.x86_64/jre/lib/security/cacerts -storepass changeit

Если вы видите ошибки или пустой вывод, trust store действительно пуст. Если вывод содержит список сертификатов, попробуйте найти нужный:

bash
# Ищем сертификаты Let's Encrypt (пример)
sudo keytool -list -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el8_4.x86_64/jre/lib/security/cacerts -storepass changeit | grep "Let's Encrypt"

Импорт недостающих сертификатов

Если вам нужны дополнительные сертификаты (например, для корпоративных SMTP серверов), их можно импортировать:

bash
# Импортируем сертификат из файла
sudo keytool -import -alias mycert -file /path/to/certificate.crt -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el8_4.x86_64/jre/lib/security/cacerts -storepass changeit

# Или импортируем из уже установленной системы
sudo keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el8_4.x86_64/jre/lib/security/cacerts -deststorepass changeit

Проверка SSL соединения

После настройки trust store можно проверить, работает ли SSL соединение:

bash
# Тестируем соединение с SMTP сервером
openssl s_client -connect smtp.gmail.com:465

Если соединение устанавливается без ошибок, trust store настроен правильно.


Оптимизация конфигурации Jenkins для работы с SSL

Даже если trust store настроен правильно, могут потребоваться дополнительные настройки в Jenkins для работы с SSL:

Конфигурация системы в Jenkins

  1. Зайдите в Jenkins → Manage Jenkins → System Configuration
  2. В разделе “Extended E-mail Notification” настройте SMTP параметры:
  • SMTP server: smtp.gmail.com
  • Use SSL: true
  • Port: 465
  • User credentials: ваши учетные данные Gmail

Альтернативная конфигурация с JavaMail

Если стандартная настройка не работает, можно использовать конфигурацию через JavaMail:

groovy
// В Script Console Jenkins
import hudson.tasks.Mailer
import hudson.tasks.MailerDescriptor

def mailer = jenkins.model.Jenkins.instance.getDescriptor(Mailer.class)
mailer.setSmtpHost("smtp.gmail.com")
mailer.setUseSsl(true)
mailer.setSmtpPort(465)
mailer.setSmtpAuth("your-email@gmail.com", "your-app-password")
mailer.save()

Проверка логов Jenkins

Всегда проверяйте логи Jenkins на предмет ошибок SSL:

bash
sudo tail -f /var/log/jenkins/jenkins.log | grep -i "ssl\|trust\|certificate"

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


Заключение

Ошибка trustAnchors parameter must be non-empty при настройке email в Jenkins на Linux — это решаемая проблема, но она требует правильного подхода. Как мы выяснили, главная причина — пустой или неправильно настроенный Java trust store.

Для Fedora Linux с Oracle JDK наиболее надежным решением является установка пакета ca-certificates-java и последующая конфигурация через sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure. Если это не помогает, можно попробовать копировать trust store с Windows или импортировать необходимые сертификаты вручную.

Важно помнить, что trust store на Linux по умолчанию может быть значительно меньше, чем на Windows, поэтому копирование файлов “как есть” часто не работает. Всегда проверяйте содержимое trust store с помощью команды keytool -list и импортируйте недостающие сертификаты.

После правильной настройки trust store и оптимизации конфигурации Jenkins, ваша система должна успешно отправлять email уведомления через SSL/TLS соединения без ошибок trustAnchors.


Источники

  1. Stack Overflow — Решение проблемы trustAnchors parameter must be non-empty: https://stackoverflow.com/questions/6784463/error-trustanchors-parameter-must-be-non-empty
  2. Edureka Community — Настройка trust store для Jenkins в Linux: https://www.edureka.co/community/14736/error-trustanchors-parameter-must-be-non-empty
  3. Bright Softwares — Копирование cacerts с Windows на Linux для Jenkins: https://bright-softwares.com/blog/en/jenkins/trustanchors-parameter-must-be-non-empty
D

Ошибка “trustAnchors parameter must be non-empty” возникает, когда хранилище доверенных сертификатов (trust store) пусто, не найдено или не может быть открыто из-за неправильного пароля или прав доступа. Для решения проблемы в Linux системах можно использовать различные подходы. В Ubuntu 18.04 и новее необходимо установить пакет ca-certificates-java и выполнить команду sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure. Также можно создать пустой JKS файл с паролем “changeit” и затем перенастроить сертификаты. Для проверки содержимого trust store используйте команду keytool -list -keystore <путь к cacerts>. Если проблема связана с форматом PKCS12 вместо JKS, измените настройки в файле java.security.

H

Эта ошибка возникает, когда указанное хранилище доверенных сертификатов (truststore) либо пусто, либо не найдено, либо не может быть открыто из-за проблем с правами доступа. Для решения проблемы в Ubuntu используйте команду sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure. Важно отметить, что ca-certificates-java не является зависимостью Oracle JDK/JRE, поэтому его нужно установить вручную. Для систем с Oracle JDK обязательно установите этот пакет, чтобы правильно настроить trust store для работы SSL в Jenkins.

При переносе Hudson с Windows на Fedora Linux с использованием Java Sun (не OpenJDK) возникает проблема с trust store. По умолчанию truststore в JRE Linux пуст (размер всего 32 байта, тогда как на Windows он составляет 80kb). Решением является копирование файла cacerts с Windows в Linux. Для этого скопируйте файл jre/lib/security/cacerts с Windows машины в соответствующую директорию на Linux. После копирования файла cacerts из Windows в Linux, проблема с trustAnchors была решена, и Jenkins начал корректно отправлять email уведомления.

Авторы
D
Разработчик
U
Программист
M
Разработчик
M
Системный администратор
S
Разработчик
H
Участник сообщества
K
Эксперт
N
Эксперт
Источники
Проверено модерацией
Модерация
Настройка email в Jenkins: решение ошибки trustAnchors на Linux