Настройка TLS-сертификата Let's Encrypt для Postfix
Цель
Настроить сертификат Let's Encrypt для Postfix, чтобы SMTP-сервер отдавал доверенный TLS-сертификат вместо self-signed.
Предварительные условия
* DNS-имя сервера уже настроено и указывает на нужный IP * в примере используется имя: host.mydomain.ru * порт 80/tcp доступен из Интернета для прохождения проверки Let's Encrypt * Postfix уже установлен
—
1. Установить certbot
sudo apt update sudo apt -y install certbot
Проверить, не занят ли порт 80:
ss -nltp | grep :80
Если порт 80 занят веб-сервером или другим процессом, его нужно временно освободить на время выпуска сертификата.
—
2. Проверить и открыть порт 80 в UFW
Проверить текущее состояние firewall:
sudo ufw status
Разрешить входящие подключения на порт 80:
sudo ufw allow to any port 80 comment "CertBot"
Проверить правило:
sudo ufw status
Применить правила:
sudo ufw reload
—
3. Выпустить сертификат Let's Encrypt
Получить сертификат через standalone-режим:
sudo certbot certonly --standalone -d host.mydomain.ru --agree-tos --email myemail@mydomain.com
Проверить, что сертификат выпущен:
sudo certbot certificates
Что должно получиться
После успешного выпуска сертификата должны появиться файлы:
/etc/letsencrypt/live/host.mydomain.ru/fullchain.pem /etc/letsencrypt/live/host.mydomain.ru/privkey.pem
Для Postfix нужно использовать именно:
* fullchain.pem * privkey.pem
—
4. Настроить Postfix
Открыть конфигурацию:
sudo vim /etc/postfix/main.cf
Добавить или проверить следующие параметры:
smtpd_tls_security_level = may smtpd_tls_cert_file = /etc/letsencrypt/live/host.mydomain.ru/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/host.mydomain.ru/privkey.pem smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_protocols = !SSLv2,!SSLv3 smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3 smtpd_tls_ciphers = high smtpd_tls_mandatory_ciphers = high tls_preempt_cipherlist = yes
Кратко по параметрам
* smtpd_tls_security_level = may — сервер предлагает STARTTLS, но не требует его * smtpd_tls_cert_file — полный сертификат с цепочкой * smtpd_tls_key_file — закрытый ключ * smtpd_tls_loglevel = 1 — минимально полезный лог TLS * smtpd_tls_received_header = yes — добавляет информацию о TLS в заголовки письма
—
5. Применить конфигурацию
Перечитать конфигурацию Postfix:
sudo postfix reload
Если нужно проверить, нет ли ошибок в конфиге перед reload:
sudo postfix check
—
6. Проверить лог Postfix
Открыть лог в реальном времени:
sudo tail -f /var/log/mail.log | ccze
Если ccze не установлен, можно использовать обычный просмотр:
sudo tail -f /var/log/mail.log
—
7. Проверить автопродление сертификата
Проверить таймер certbot:
systemctl list-timers | grep certbot
Проверить тестовое обновление без реального продления:
sudo certbot renew --dry-run
—
8. Настроить перезагрузку Postfix после продления
Открыть файл hook-скрипта:
sudo vim /etc/letsencrypt/renewal-hooks/deploy/postfix.sh
Содержимое файла:
#!/bin/bash
systemctl reload postfix
Сделать файл исполняемым:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postfix.sh
Этот скрипт будет автоматически выполняться после успешного обновления сертификата.
—
9. Проверить, что порт 80 больше не нужен постороннему процессу
Проверка прослушивания порта 80:
ss -n4ltp | grep :80
Если после выпуска сертификата на сервере не используется web-сервис и порт 80 не нужен, правило UFW можно удалить:
sudo ufw status numbered sudo ufw delete НОМЕР_ПРАВИЛА sudo ufw reload
—
10. Проверка сертификата на SMTP
Проверить локально, какой сертификат отдаёт Postfix на 25 порту:
openssl s_client -starttls smtp -connect localhost:25 -servername host.mydomain.ru -showcerts
Что нужно увидеть:
* сертификат выдан публичным CA Let's Encrypt * в цепочке есть Let's Encrypt * нет self-signed сертификата * имя сервера совпадает с host.mydomain.ru
Проверить снаружи по FQDN:
openssl s_client -starttls smtp -connect host.mydomain.ru:25 -servername host.mydomain.ru -showcerts
—
Итоговый минимальный набор команд
sudo apt update sudo apt -y install certbot ss -nltp | grep :80 sudo ufw status sudo ufw allow to any port 80 comment "CertBot" sudo ufw status sudo ufw reload sudo certbot certonly --standalone -d host.mydomain.ru sudo certbot certificates sudo vim /etc/postfix/main.cf sudo postfix reload sudo tail -f /var/log/mail.log | ccze systemctl list-timers | grep certbot sudo vim /etc/letsencrypt/renewal-hooks/deploy/postfix.sh sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postfix.sh ss -n4ltp | grep :80
—
Рекомендуемый фрагмент /etc/postfix/main.cf
smtpd_tls_security_level = may smtpd_tls_cert_file = /etc/letsencrypt/live/host.mydomain.ru/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/host.mydomain.ru/privkey.pem smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_protocols = !SSLv2,!SSLv3 smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3 smtpd_tls_ciphers = high smtpd_tls_mandatory_ciphers = high tls_preempt_cipherlist = yes
—
Частые ошибки
Использован не тот файл сертификата
Нужно указывать:
fullchain.pem
а не только:
cert.pem
—
Имя в сертификате не совпадает с SMTP-именем сервера
Проверь:
postconf -n | grep myhostname hostname -f
—
Порт 80 недоступен снаружи
Let's Encrypt не сможет пройти проверку.
—
Порт 80 уже занят
Нужно временно остановить процесс, который слушает 80/tcp.
—
Быстрая проверка после настройки
postconf -n | grep -E 'myhostname|smtpd_tls_cert_file|smtpd_tls_key_file|smtpd_tls_security_level|smtpd_tls_loglevel' openssl s_client -starttls smtp -connect localhost:25 -servername host.mydomain.ru sudo certbot certificates