Содержание

Настройка 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