Вопрос или проблема
Я уже некоторое время использую почтовый сервер Postfix/Dovecot (Ubuntu server 16.04), без серьезных проблем. У меня также есть выданный сертификат Let’s Encrypt для моего имени хоста, который я настроил в /etc/dovecot/conf.d/10-ssl.conf
. Все работало нормально, но, как вы, возможно, знаете, они действительны только 90 дней. У меня настроен certbot для автоматического обновления сертификатов, и он тоже работает нормально.
Вдруг, сегодня, как мой Thunderbird, так и Thunderbird клиента и его iPhone начали жаловаться на недействительные сертификаты. Я проверил сертификаты через certbot certificates
и выяснил, что сертификат, который я использую, был вполне действительным, не просроченным. Проверка сертификата в Thunderbird показала, что сертификат истек накануне, показывая хэш, который не совпадал с текущим сертификатом.
По сути, кажется, что Dovecot выдает просроченный сертификат из какого-то ‘кэша’. Перезапуск dovecot просто ‘магически’ все исправил, но я хотел бы понять, что здесь произошло, так как мои поиски по DDG по кэшам сертификатов или подобным в Dovecot не дали результатов. Я упустил что-то очевидное? Кажется, я что-то очевидное упустил, но не могу понять что.
РЕДАКТИРОВАНИЕ
Это в основном ответ здесь, но поскольку мой certbot обновляется на системном таймере вместо cronjob, я постараюсь дать ответ для этой ситуации здесь для будущего использования и для всех, кто в такой же ситуации, как я.
Это в основном та же проблема, как на которую ответил здесь Джеральд Шнайдер. Однако, так как моя установка не зависит от cronjob, а от системного таймера, ответ немного отличается.
Let’s Encrypt, по крайней мере, на Ubuntu позволит вам создать хуки, когда автоматическое обновление идет через таймер (проверьте это, используя systemctl list-timers
и посмотрите, есть ли он там).
По сути, есть два события, на которые вы можете настроить хуки: deploy и post. Разместите свои bash-скрипты в папках /etc/letsencrypt/renewal-hooks/deploy
или /etc/letsencrypt/renewal-hooks/post
соответственно. Deploy будет выполняться при каждом обновлении сертификата, post — после завершения всех обновлений.
Скрипт deploy имеет доступ к переменным $RENEWED_DOMAINS и $RENEWED_LINEAGE. Я разместил следующий скрипт в /etc/letsencrypt/renewal-hooks/deploy
:
#!/bin/bash
for domain in $RENEWED_DOMAINS
do
if [ "$domain" = my.mailserver.com ]
then
doveadm reload >/dev/null
fi
done
Что перезагрузит конфигурацию dovecot каждый раз, когда сертификат для ‘my.mailserver.com’ (очевидно, замените это на реальный домен) будет переустановлен.
Ответ или решение
Когда администратор работает с почтовым сервером на базе Postfix и Dovecot на сервере Ubuntu 16.04 и замечает, что клиенты, такие как Thunderbird и iPhone, выдают предупреждения о недействительных сертификатах, хотя сертификаты Let’s Encrypt должны быть обновлены и действительны, это вызывает значительное беспокойство. Наиболее вероятной причиной данной ситуации является некорректная работа с сертификатом после автоматического обновления через Certbot. Давайте рассмотрим возможный сценарий и решение для данной проблемы более детально.
Основная проблема
Проблема возникает, когда Dovecot продолжает обслуживать старый, истекший сертификат, несмотря на успешное обновление сертификата Let’s Encrypt с помощью Certbot. После перезапуска Dovecot проблема исчезает, указывая на то, что Dovecot использует кешированный сертификат, который не был обновлен правильно в процессе автоматического обновления.
Возможные причины
-
Кеширование сертификанта: Dovecot может использовать предыдущую версию сертификата из вашего кеша, что приводит к этой ошибке.
-
Отсутствие автоматического перезапуска сервиса: Когда Certbot обновляет сертификаты, важно, чтобы соответствующие службы, такие как Dovecot, также обновляли свои конфигурации для применения новых сертификатов.
Рекомендации по решению
Для стабильного решения проблемы необходимо автоматизировать процесс перезапуска или перезагрузки Dovecot после каждого обновления сертификата. Это можно сделать, используя функциональность Certbot для выполнения скриптов после обновления сертификатов.
Шаги по автоматизации:
-
Проверка наличия таймера systemd: Убедитесь, что Certbot запланирован через таймер systemd (например, путем выполнения команды
systemctl list-timers
). -
Настройка hook-скрипта: Создайте bash-скрипт, который будет выполнен каждый раз после обновления сертификата. Для этого:
-
Разместите скрипт в каталоге:
/etc/letsencrypt/renewal-hooks/deploy
. -
Убедитесь, что скрипт использует переменные окружения
$RENEWED_DOMAINS
и$RENEWED_LINEAGE
для правильной работы. -
Пример скрипта:
#!/bin/bash for domain in $RENEWED_DOMAINS do if [ "$domain" = my.mailserver.com ] then doveadm reload >/dev/null fi done
-
Этот скрипт гарантирует, что каждый раз, когда обновляется сертификат для вашего домена, конфигурация Dovecot перезагружается без необходимости ручного вмешательства.
Заключение
Правильная настройка и автоматизация процессов обновления сертификатов критически важны для поддержания безопасности и функциональности почтового сервера. Использование hook-скриптов Certbot, обеспечивающих автоматическую перезагрузку сервисов, минимизирует работу по обслуживанию и устраняет риск возникновения проблем с недействительными сертификатами.