Home » Linux » CentOS » Настройка SSL/TLS сертификатов Let's Encrypt в postfix и dovecot

Настройка SSL/TLS сертификатов Let's Encrypt в postfix и dovecot

Я давно написал и поддерживаю в актуальном состоянии статьи про настройку почтовых серверов. При этом до сих пор не дошли руки описать использование в них бесплатных сертификатов. Так что сегодня я расскажу, как настроить бесплатный SSL/TLS сертификат от Let's Encrypt для использования в postfix и dovecot

Если у вас есть желание научиться профессионально строить и поддерживать высокодоступные виртуальные и кластерные среды, рекомендую познакомиться с онлайн-курсом Администратор Linux. Виртуализация и кластеризация в OTUS. Курс не для новичков, для поступления нужно пройти .

Настройка SSL/TLS сертификатов Let's Encrypt в postfix и dovecot

Введение

Речь пойдет про типовой почтовый сервер, настроенный самостоятельно на базе популярных бесплатных компонентов - Настройка postfix + dovecot + mysql база + postfixadmin + roundcube + dkim на CentOS 8. В качестве бэкенда для web сервера там используется apache, так что получать сертификаты будем с его помощью.

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

Тем не менее, последнее время наблюдается тенденция по выдавливанию самоподписанных сертификатов из обращения. Некоторый софт напрочь отказывается им доверять, не оставляя возможность пользователям это исправить. Вместо того, чтобы бороться с софтом, я предлагаю вам настроить всем известные сертификаты от let's encrypt. К тому же сделать это относительно просто.

Получаем сертификат от Let's Encrypt

Итак, я считаю, что вы настроили почтовый сервер по предложенной выше ссылке. Значит, у вас установлен веб сервер Apache, а так же все в порядке с dns записями. Сертификатов мы получим сразу два. Для доменных имен:

  • mail.site.ru - имя почтового сервера, этот сертификат будут использовать postfix и apache
  • webmail.site.ru - домен для web интерфейса почты, будет использовать веб сервер

Для настройки получения сертификатов let's encrypt и настройки apache, нам нужно будет установить несколько пакетов. Напоминаю, что речь идет про Centos 8. В других системах настройка будет аналогичной, только имена пакетов могут отличаться.

# dnf install certbot python3-certbot-apache mod_ssl

Получение сертификата Let's Encrypt

Пакеты эти живут в репозитории epel, так что если он еще не подключен, подключите.

# dnf install epel-release

Дальше нам нужно добавить 2 виртуальных домена в настройки apache. Для этого создаем 2 конфига в директории /etc/httpd/conf.d/.

1. mail.site.ru.conf

<VirtualHost *:443>
 ServerName mail.site.ru
 DocumentRoot /var/www/mail.site.ru/
 <Directory /var/www/mail.site.ru/>
  Options -Indexes +FollowSymLinks
  AllowOverride All
 </Directory>
 ErrorLog /var/log/httpd/mail.site.ru-error.log
 CustomLog /var/log/httpd/mail.site.ru-access.log combined
</VirtualHost>

<VirtualHost *:80>
 ServerName mail.site.ru
 DocumentRoot /var/www/mail.site.ru/
 <Directory /var/www/mail.site.ru/>
  Options -Indexes +FollowSymLinks
  AllowOverride All
 </Directory>
 ErrorLog /var/log/httpd/mail.site.ru-error.log
 CustomLog /var/log/httpd/mail.site.ru-access.log combined
</VirtualHost>

2. webmail.site.ru.conf

<VirtualHost *:443>
 ServerName webmail.site.ru
 DocumentRoot /var/www/webmail.site.ru/
 <Directory /var/www/webmail.site.ru/>
  Options -Indexes +FollowSymLinks
  AllowOverride All
 </Directory>
 ErrorLog /var/log/httpd/webmail.site.ru-error.log
 CustomLog /var/log/httpd/webmail.site.ru-access.log combined
</VirtualHost>

<VirtualHost *:80>
 ServerName webmail.site.ru
 DocumentRoot /var/www/webmail.site.ru/
 <Directory /var/www/webmail.site.ru/>
  Options -Indexes +FollowSymLinks
  AllowOverride All
 </Directory>
 ErrorLog /var/log/httpd/webmail.site.ru-error.log
 CustomLog /var/log/httpd/webmail.site.ru-access.log combined
</VirtualHost>

По сути конфиги идентичные, только названия доменов разные. Теперь можно проверить конфигурацию apache и перезапустить его.

# apachectl -t
# apachectl reload

Если увидите ошибку:

AH00526: Syntax error on line 85 of /etc/httpd/conf.d/ssl.conf:
SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty

Просто удалите конфиг /etc/httpd/conf.d/ssl.conf. Он нам не нужен.

Если нет ошибок, то можно запускать certbot и получать сертификаты. Делается это очень просто.

# certbot --apache

При первом запуске вам нужно будет указать email для автоматического создания учетной записи. Затем выбрать по очереди каждый из доменов для создания бесплатного сертификата.

Запуск cerbot

Если все прошло без ошибок, то вы увидите в директории /etc/letsencrypt/live две папки с сертификатами для каждого из доменов.

Так же certbot автоматически добавит в конфигурации виртуальных хостов apache несколько дополнительных параметров.

<VirtualHost *:443>
 ServerName webmail.site.ru
 DocumentRoot /var/www/webmail.site.ru/
 <Directory /var/www/webmail.site.ru/>
  Options -Indexes +FollowSymLinks
  AllowOverride All
 </Directory>
 ErrorLog /var/log/httpd/webmail.site.ru-error.log
 CustomLog /var/log/httpd/webmail.site.ru-access.log combined
 SSLCertificateFile /etc/letsencrypt/live/mail.site.ru/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/mail.site.ru/privkey.pem
 Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

<VirtualHost *:80>
 ServerName webmail.site.ru
 DocumentRoot /var/www/webmail.site.ru/
 <Directory /var/www/webmail.site.ru/>
  Options -Indexes +FollowSymLinks
  AllowOverride All
 </Directory>
 ErrorLog /var/log/httpd/webmail.site.ru-error.log
 CustomLog /var/log/httpd/webmail.site.ru-access.log combined
 RewriteEngine on
 RewriteCond %{SERVER_NAME} =mail.site.ru
 RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

В этот виртуальный хост установите веб почту, если вам она нужна.

Let's Encrypt в Postfix

Теперь настроим postfix на работу с бесплатным сертификатом от let's encrypt. Для этого достаточно в конфигурационный файл /etc/postfix/main.cf добавить несколько параметров:

smtpd_tls_key_file = /etc/letsencrypt/live/mail.site.ru/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.site.ru/fullchain.pem

Этого достаточно при условии, что вы настраивали postfix по моей статье. Если нет - сходите, сверьтесь. Там есть еще некоторые параметры, касающиеся tls.

После этого надо перечитать конфигурацию postfix.

# systemctl reload postfix

Dovecot и сертификаты Let's Encrypt

Дальше проделаем то же самое, только для Dovecot. Настроим его на работу с сертификатом let's encrypt. Для этого добавляем в его конфиг /etc/dovecot/dovecot.conf параметры.

ssl_cert = </etc/letsencrypt/live/mail.site.ru/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.site.ru/privkey.pem

И так же перечитываем конфигурацию.

# systemctl reload dovecot

Теперь можно проверить корректность настройки.

Проверка сертификата ssl/tls в почтовом сервере

Способов проверить сертификат в почтовом сервере множество. Например, у меня есть статья, где я настраиваю мониторинг сертификатов с помощью Zabbix. Там же есть примеры и для почтового сервера. Вот так с помощью openssl в консоли сервера можно посмотреть текущие сертификаты.

# openssl s_client -starttls smtp -connect mail.site.ru:25 | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d'=' -f2

Установка сертификата в почтовый сервер

Это самый простой и быстрый способ. Можете проверить прямо из консоли почтового сервера. Так же можно воспользоваться каким-то готовым сервисом, например https://ssl-tools.net/mailservers.

Проверка ssl tls сертификата по smtp

Если у вас все в порядке, значит настройка ssl в postfix закончена. Остался последний штрих.

Обновление сертификатов почтового сервера

В Centos 8 certbot почему-то не добавил себя в планировщики. Ни в cron, ни в systemd timers. Но нам мало обновить сертификаты, нужно еще перезапустить службы, которые его используют. Для этого идем в конфиг letsencrypt для каждого домена и добавляем в самый конец параметр.

post_hook = systemctl reload postfix dovecot httpd

Сделать это нужно в конфигурационных файлах в директории /etc/letsencrypt/renewal/. Там для каждого домена будет свой конфиг. После этого можете прогнать тест обновления, чтобы убедиться в том, что ошибок нет.

# certbot renew --dry-run

Обновление сертификата через certbot

Все в порядке. Можно добавлять задание в /etc/crontab, или в любой другой конфиг, как вы обычно делаете. Я больше люблю все задачи держать в одном системном конфиге crontab.

1 1 * * * root /usr/bin/certbot renew

На этом у меня все по настройке SSL/TLS сертификатов в почтовом сервере postfix + dovecot. Если есть замечания и предложения, жду их в комментариях.

Онлайн курс "Нагрузочное тестирование"

Обучение, которое сделает вас востребованным на рынке автоматизатором в тестировании и перевернёт ваше представление о том, что тестирование - это скучно и является только шагом перед работой разработчиком. Чему вы научитесь на курсе:
  • Написание скриптов/ сценариев в Performance center, Jmeter, Gatling, k6.io
  • Мониторинг различных метрик во время тестирования с помощью Grafana и других инструментов
  • Планирование нагрузочного тестирования для разных случаев и целей
  • Методики и отчетность — какие разделы важны и для чего
  • Оценка точности и качества тестирования, чтобы улучшать процессы и повышать достоверность результатов
    • Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Помогла статья? Подписывайся на telegram канал автора

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

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

14 комментариев

  1. Аватар

    Вообще всё сломалось. Not Found The requested URL / was not found on this server. Благо сегодня выходной. Что делать...? Как вернуть хотя бы всё как было...? Почта в тандербёрде не ходит, веб-интерфейс не грузится...

    • Zerox

      В статье вообще нет ничего, что могло бы сломать работу почты. Вы в конфигах postfix и dovecot только путь к сертификатам меняете и все. Вернитесь обратно на те сертификаты, с которыми все нормально работало. А на будущее, тестируйте все изменения сначала на тестовых серверах, а не рабочих.

  2. Аватар

    Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80.

    Добавить 80-ый порт в виртуальный хост. Но вроде всё же добавлено.

  3. Аватар
    Альберт

    После добавление 2х вирт хостов у меня не работает postfixadmin ошибка 404 все на месте каталог postfixadmin тоже на месте с веб сервером кроме 2х хостов виртуальныйх ничего не делал.Как починить???

    • Zerox

      А вы до этого как в postfixadmin ходили? По ip адресу?

      • Аватар
        Альберт

        да ip/postfixadmin

        • Zerox

          А по ip вообще открывается страница заглушка? Я вот буквально только что все закончил по этой статье настраивать. Все получилось. Если уже настроили сертификаты, то проще перенести директории с postfixadmin и roundcube в какие-то виртуальные хосты и ходить туда по https. Я так делаю.

  4. Аватар

    И certbot всё время ругается на то что 80 порт занят httpd Приходиться его останавливать потом запускать выпуск сертификатов. Как это можно обойти?

    • Zerox

      Это происходит, когда вы выбираете подтверждение через запуск собственного веб сервера certbot. Но он не может его запустить, потому что у вас apache работает на 80-м порту. Подтверждайте другим способом, через webroot.

  5. Аватар

    Не знаете с чем может быть связана данная ошибка, до последнего времени обновлялись сертификаты без проблем!

    [root@srv conf.d]# certbot renew --dry-run
    Saving debug log to /var/log/letsencrypt/letsencrypt.log

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Processing /etc/letsencrypt/renewal/srv.zflan.pp.ua.conf
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Cert is due for renewal, auto-renewing...
    Plugins selected: Authenticator standalone, Installer None
    Renewing an existing certificate
    Performing the following challenges:
    http-01 challenge for srv.geolan.pp.ua
    http-01 challenge for srv.zflan.pp.ua
    Waiting for verification...
    Challenge failed for domain srv.geolan.pp.ua
    Challenge failed for domain srv.zflan.pp.ua
    http-01 challenge for srv.geolan.pp.ua
    http-01 challenge for srv.zflan.pp.ua
    Cleaning up challenges
    Attempting to renew cert (srv.zflan.pp.ua) from /etc/letsencrypt/renewal/srv.zflan.pp.ua.conf produced an unexpected error: Some challenges have failed.. Skipping.
    All renewal attempts failed. The following certs could not be renewed:
    /etc/letsencrypt/live/srv.zflan.pp.ua/fullchain.pem (failure)

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ** DRY RUN: simulating 'certbot renew' close to cert expiry
    ** (The test certificates below have not been saved.)

    All renewal attempts failed. The following certs could not be renewed:
    /etc/letsencrypt/live/srv.zflan.pp.ua/fullchain.pem (failure)
    ** DRY RUN: simulating 'certbot renew' close to cert expiry
    ** (The test certificates above have not been saved.)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1 renew failure(s), 0 parse failure(s)

    IMPORTANT NOTES:
    - The following errors were reported by the server:

    Domain: srv.geolan.pp.ua
    Type: unauthorized
    Detail: Invalid response from
    http://srv.geolan.pp.ua/.well-known/acme-challenge/lBCCYdjJqT9wAiO9-EweeSpzI5aU0iBQLBZLnvvgB9g
    [45.10.34.32]: "\n\n404 Not
    Found\n\nNot Found\n<p"

    Domain: srv.zflan.pp.ua
    Type: unauthorized
    Detail: Invalid response from
    http://srv.zflan.pp.ua/.well-known/acme-challenge/kBRpo6OdqY80sGlmG-nmUlRvgAQ1NxpJiwpldbPkmUo
    [45.10.34.32]: "\n\n404 Not
    Found\n\nNot Found\n<p"

    To fix these errors, please make sure that your domain name was
    entered correctly and the DNS A/AAAA record(s) for that domain
    contain(s) the right IP address.
    - The following errors were reported by the server:

    • Zerox

      Вот ваша ошибка:

      Invalid response from
      http://srv.geolan.pp.ua/.well-known/acme-challenge/lBCCYdjJqT9wAiO9-EweeSpzI5aU0iBQLBZLnvvgB9g
      404 Not Found

      Certbot создает директорию /.well-known/acme-challenge/l в webroot, который вы указали при первом выпуске сертификата. И потом извне обращается к этой директории и файлам в ней для подтверждения того, что вы действительно владелец веб сервера. Но вместо своих файлов получает ошибку 404 Not Found. Вам надо разбираться с настройками веб сервера, почему так происходит.

  6. Аватар

    Спасибо.
    Развернул на Proxmox VE связку Debian + postfix + dovecot + Sogo + nginx + apache solr + apache tika + Proxmox Mail Gateway (антиспам + логирование кто-куда-когда). Привязал все это к AD. Бэкапы (инкрементные) ВМ выполняет Proxmox Backup Server (на днях вышел релиз). Периметр сторожит pfsense. В кач-ве NAS - xigmanas и OMV.

Добавить комментарий

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.