Автоматизация получения letsencrypt сертификатов для zimbra
Добавлено: 26 май 2026, 10:55
Уважаемый читатель, я всячески отговариваю от использования какой-либо зимбры, т.к. это ловушка из которой не будет выхода.
На момент написания этой статьи (2026 год) все возможные версии zimbra ose уже перестали разрабатываться и рано или поздно это аукнется.
И переезд на другую почтовую систему будет сопряжен с невероятными трудностями, так что с зимброй лучше не начинать, а если только начали, то лучше сразу и закончить.
Тем не менее. Хотя бы для истории я напишу эту инструкцию, хотя бы затем что в других местах я этого не видел.
Для полной автоматизации нам понадобится программа certbot - это официальный клиент lestencrypt.
Сертификат мы будем получать для той версии зимбры, которую последнюю выложили zextras. Пока что я не нашёл никакой более свежей сборки не от васянов. А учитывая что даже сборки zextras каждый раз всё ломали, что может случится если установить сборку от васяна и кто это всё будет исправлять становится вообще непонятно.
Часть 1: получение сертификата
Официальный мануал по certbot почему-то рекомендует устанавливать certbot из pip. Я не знаю зачем так делать, учитывая что пакет certbot имеется практически во всех дистрибутивах линукс нативно. Я слышал краем уха что по какой-то причине пакет из репозиториев не совместим с зиброй. Ничего по этому поводу сказать не могу, в Rocky Linux 8 и zimbra 9 всё работает.
У меня в rocky linux используется certbot 1.22.0 установленный через dnf.
Для получения сертификата нужно остановить службу mailboxd чтобы освободить порт 443. Возможно что ваша зимбра использует nginx, тогда вероятно остановить придётся какую-то другую службу, тут уж сами разберитесь.
Получаем сертификат:
Теперь его нужно установить. Однако, я рекомендую пойти немножко другим путём чтобы одновременно и установить сертификат и проверить что в будущем всё будет автоматически обновляться.
Часть 2: автоматическое обновление
В certbot имеется возможность запускать скрипты в случае если сертификат будет обновлён.
Именно этим функционалом и будем пользоваться.
Эти скрипты лежат в директории /etc/letsencrypt/renewal-hooks
pre - запускаются до попытки обновления
post - запускаются после попытки обновления
deploy - запускаются только после успешного обновления
В директории pre создаём файл stopzm (имя произвольное) с содержанием:
В директории post создаём файл startzm с содержанием:
Ещё раз напоминаю, это для случаев где не используется proxy (nginx) насколько я помню в случае если зимбра работает через прокси, нужно тормозить службу прокси.
И наконец в директории deploy создаём последний файл zimbra со следующим содержимым:
Разумеется domain.ru надо поменять на свой домен.
После создания всех трёх файлов, не забудьте добавить им бит разрешающий исполенение
И теперь разберём подробно что здесь происходит:
temp=$(mktemp -d)
создаёт в директории /tmp временную папку. Её имя попадает в переменную temp.
cd "$temp" || exit
мы пытаемся переместится в созданную временную директорию. Если это невозможно, скрипт завершится.
cp -rL /etc/letsencrypt/live/domain.ru ./
копируем папку со всеми сертификатами во временную директорию.
cat /etc/ssl/ISRG-X1.pem >> domain.ru/fullchain.pem
Нужно добавить корневой сертификат ISRG X1 в цепочку сертификатов. файл /etc/ssl/ISRG-X1.pem нужно предварительно скачать. Об этом ниже. Добавлять его в цепочку нужно т.к. зимбра без этого сертификата не отдуплит.
cp domain.ru/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
Этим действием копируем закрытый ключ в директорию зимбры.
chmod -R 777 .
По-умолчанию у папки с сертификатами права доступа будут только у root. Нам же нужно чтобы пользователь zimbra получил к ним доступ.
su zimbra -c "/opt/zimbra/bin/zmcertmgr deploycrt comm $temp/domain.ru/cert.pem $temp/domain.ru/fullchain.pem"
Этой строкой мы заставим зимбру раскопировать сертификаты по своим внутренностям.
cd; rm -rf "$temp"
Больше временная папка с сертификатами не потребуется, так что её нужно удалить.
su -l zimbra -c "zmcontrol restart"
Рестартим зимбру.
Получим сертификат ROOT X1 и проверим как оно работает
Получим сертификат и положим его в общедоступное место:
Теперь когда у нас есть весь комплект, попробуйте запустить от рута скрипт zimbra в папке deploy.
Если после прогона скрипта у зимбры появился сертификат - значит всё успешно.
Всё что осталось сделать - запустить таймер certbot-renew.timer.
Теперь о сертификатах зимбры можно не переживать.
На момент написания этой статьи (2026 год) все возможные версии zimbra ose уже перестали разрабатываться и рано или поздно это аукнется.
И переезд на другую почтовую систему будет сопряжен с невероятными трудностями, так что с зимброй лучше не начинать, а если только начали, то лучше сразу и закончить.
Тем не менее. Хотя бы для истории я напишу эту инструкцию, хотя бы затем что в других местах я этого не видел.
Для полной автоматизации нам понадобится программа certbot - это официальный клиент lestencrypt.
Сертификат мы будем получать для той версии зимбры, которую последнюю выложили zextras. Пока что я не нашёл никакой более свежей сборки не от васянов. А учитывая что даже сборки zextras каждый раз всё ломали, что может случится если установить сборку от васяна и кто это всё будет исправлять становится вообще непонятно.
Часть 1: получение сертификата
Официальный мануал по certbot почему-то рекомендует устанавливать certbot из pip. Я не знаю зачем так делать, учитывая что пакет certbot имеется практически во всех дистрибутивах линукс нативно. Я слышал краем уха что по какой-то причине пакет из репозиториев не совместим с зиброй. Ничего по этому поводу сказать не могу, в Rocky Linux 8 и zimbra 9 всё работает.
У меня в rocky linux используется certbot 1.22.0 установленный через dnf.
Для получения сертификата нужно остановить службу mailboxd чтобы освободить порт 443. Возможно что ваша зимбра использует nginx, тогда вероятно остановить придётся какую-то другую службу, тут уж сами разберитесь.
Получаем сертификат:
Код: Выделить всё
su -l zimbra -c "zmmailboxdctl stop"
/usr/local/sbin/certbot certonly -d <ваш домен> --standalone --preferred-chain "ISRG Root X1"Часть 2: автоматическое обновление
В certbot имеется возможность запускать скрипты в случае если сертификат будет обновлён.
Именно этим функционалом и будем пользоваться.
Эти скрипты лежат в директории /etc/letsencrypt/renewal-hooks
pre - запускаются до попытки обновления
post - запускаются после попытки обновления
deploy - запускаются только после успешного обновления
В директории pre создаём файл stopzm (имя произвольное) с содержанием:
Код: Выделить всё
#!/usr/bin/env bash
su -l zimbra -c "zmmailboxdctl stop"Код: Выделить всё
#!/usr/bin/env bash
su -l zimbra -c "zmmailboxdctl start"И наконец в директории deploy создаём последний файл zimbra со следующим содержимым:
Код: Выделить всё
#!/usr/bin/env bash
temp=$(mktemp -d)
cd "$temp" || exit
cp -rL /etc/letsencrypt/live/domain.ru ./
cat /etc/ssl/ISRG-X1.pem >> domain.ru/fullchain.pem
cp domain.ru/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
chmod -R 777 .
su zimbra -c "/opt/zimbra/bin/zmcertmgr deploycrt comm $temp/domain.ru/cert.pem $temp/domain.ru/fullchain.pem"
cd; rm -rf "$temp"
su -l zimbra -c "zmcontrol restart"
После создания всех трёх файлов, не забудьте добавить им бит разрешающий исполенение
Код: Выделить всё
sudo chmod +x pre/stopzm post/startzm deploy/zimbratemp=$(mktemp -d)
создаёт в директории /tmp временную папку. Её имя попадает в переменную temp.
cd "$temp" || exit
мы пытаемся переместится в созданную временную директорию. Если это невозможно, скрипт завершится.
cp -rL /etc/letsencrypt/live/domain.ru ./
копируем папку со всеми сертификатами во временную директорию.
cat /etc/ssl/ISRG-X1.pem >> domain.ru/fullchain.pem
Нужно добавить корневой сертификат ISRG X1 в цепочку сертификатов. файл /etc/ssl/ISRG-X1.pem нужно предварительно скачать. Об этом ниже. Добавлять его в цепочку нужно т.к. зимбра без этого сертификата не отдуплит.
cp domain.ru/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
Этим действием копируем закрытый ключ в директорию зимбры.
chmod -R 777 .
По-умолчанию у папки с сертификатами права доступа будут только у root. Нам же нужно чтобы пользователь zimbra получил к ним доступ.
su zimbra -c "/opt/zimbra/bin/zmcertmgr deploycrt comm $temp/domain.ru/cert.pem $temp/domain.ru/fullchain.pem"
Этой строкой мы заставим зимбру раскопировать сертификаты по своим внутренностям.
cd; rm -rf "$temp"
Больше временная папка с сертификатами не потребуется, так что её нужно удалить.
su -l zimbra -c "zmcontrol restart"
Рестартим зимбру.
Получим сертификат ROOT X1 и проверим как оно работает
Получим сертификат и положим его в общедоступное место:
Код: Выделить всё
sudo curl -O /etc/ssl/ISRG-X1.pem https://letsencrypt.org/certs/isrgrootx1.pemКод: Выделить всё
sudo /etc/letsencrypt/renewal-hooks/deploy/zimbraВсё что осталось сделать - запустить таймер certbot-renew.timer.
Теперь о сертификатах зимбры можно не переживать.