Настройка TLS-сертификата Let's Encrypt для Postfix

Настроить сертификат Let's Encrypt для Postfix, чтобы SMTP-сервер отдавал доверенный TLS-сертификат вместо self-signed.

* DNS-имя сервера уже настроено и указывает на нужный IP * в примере используется имя: host.mydomain.ru * порт 80/tcp доступен из Интернета для прохождения проверки Let's Encrypt * Postfix уже установлен

sudo apt update
sudo apt -y install certbot

Проверить, не занят ли порт 80:

ss -nltp | grep :80

Если порт 80 занят веб-сервером или другим процессом, его нужно временно освободить на время выпуска сертификата.

Проверить текущее состояние firewall:

sudo ufw status

Разрешить входящие подключения на порт 80:

sudo ufw allow to any port 80 comment "CertBot"

Проверить правило:

sudo ufw status

Применить правила:

sudo ufw reload

Получить сертификат через 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

Открыть конфигурацию:

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 в заголовки письма

Перечитать конфигурацию Postfix:

sudo postfix reload

Если нужно проверить, нет ли ошибок в конфиге перед reload:

sudo postfix check

Открыть лог в реальном времени:

sudo tail -f /var/log/mail.log | ccze

Если ccze не установлен, можно использовать обычный просмотр:

sudo tail -f /var/log/mail.log

Проверить таймер certbot:

systemctl list-timers | grep certbot

Проверить тестовое обновление без реального продления:

sudo certbot renew --dry-run

Открыть файл 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

Этот скрипт будет автоматически выполняться после успешного обновления сертификата.

Проверка прослушивания порта 80:

ss -n4ltp | grep :80

Если после выпуска сертификата на сервере не используется web-сервис и порт 80 не нужен, правило UFW можно удалить:

sudo ufw status numbered
sudo ufw delete НОМЕР_ПРАВИЛА
sudo ufw reload

Проверить локально, какой сертификат отдаёт 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 

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

Проверь:

postconf -n | grep myhostname
hostname -f

Let's Encrypt не сможет пройти проверку.

Нужно временно остановить процесс, который слушает 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