bg-tutorials

Как установить SSL-сертификат на Qmail

Это руководство показывает вам как установить SSL/TLS сертификат на Qmail, агент передачи почты, изначально написанный D. J. Bernstein. Процесс тот же, что Qmail использует уже много лет: собрать единый PEM-файл, содержащий приватный ключ, сертификат сервера и промежуточную цепочку, разместить его в /var/qmail/control/servercert.pem и перезапустить Qmail.

Прежде чем начать: Qmail — устаревший MTA

Сам Qmail не обновлялся с момента выхода оригинальной версии qmail-1.03 в 1998 году. D. J. Bernstein перевёл код в общественное достояние в 2007 году, но разработку не возобновил. Известный форк сообщества netqmail получил свой финальный релиз 1.06 в 2007 году и не поддерживался более десяти лет. Активным современным преемником является notqmail (текущий релиз 1.09, май 2024 года), который продолжает вносить исправления ошибок и обеспечивать совместимость с современными системами, оставаясь полностью совместимым с оригиналом.

Не менее важно для этого руководства: стандартный qmail не имеет встроенной поддержки SSL/TLS. TLS добавляется одним из двух сторонних способов:

  • Патч qmail-tls от Frederik Vermeulen, который добавляет STARTTLS в qmail-smtpd и считывает сертификат из жёстко заданного пути: /var/qmail/control/servercert.pem. Большинство современных пакетов qmail (включая сборки netqmail и notqmail, дистрибутив s/qmail и многие пакеты от поставщиков) поставляются с этим патчем или его аналогом.
  • stunnel перед qmail-smtpd, который оборачивает соединение в TLS на порту 465 (SMTPS). Это работает с любой сборкой qmail, поскольку завершение TLS происходит вне Qmail.

Если вы поддерживаете существующее развёртывание qmail, приведённые ниже шаги по-прежнему применимы. Если вы создаёте новый почтовый сервер с нуля, рассмотрите вместо этого Postfix или OpenSMTPD: оба имеют встроенную, хорошо поддерживаемую поддержку TLS и активные команды безопасности. У нас есть отдельное руководство о том, как установить SSL сертификат на Postfix.

Сгенерировать код CSR для Qmail

Если вы уже сгенерировали свой CSR и получили SSL-файлы от вашего CA, переходите сразу к разделу Установка SSL сертификата на Qmail.

CSR расшифровывается как Certificate Signing Request: блок закодированного текста, содержащий данные вашего домена и организации. Вы отправляете его в удостоверяющий центр (CA), чтобы тот мог проверить ваш запрос и выпустить сертификат. Генерация CSR также создаёт соответствующий приватный ключ, который остаётся на вашем сервере и требуется для установки. У вас есть два варианта:

Откройте файл CSR в любом текстовом редакторе и скопируйте весь блок, включая строки BEGIN CERTIFICATE REQUEST и END CERTIFICATE REQUEST, в поле CSR формы заказа. Сохраните файл приватного ключа в надёжном месте: вы объедините его в PEM-файл в следующем разделе.

Установка SSL сертификата на Qmail

После проверки CA отправит вам по электронной почте ZIP-архив с вашими SSL-файлами: основным (серверным) сертификатом и одним или несколькими промежуточными (CA) сертификатами. Извлеките архив на своём сервере, затем следуйте приведённым ниже шагам.

Шаг 1: Объедините ключ, сертификат и цепочку в один PEM-файл

Патч qmail-tls (и его аналоги в netqmail, notqmail и s/qmail) считывает всё необходимое для завершения TLS из одного PEM-файла. Объедините файлы в следующем порядке: сначала ваш приватный ключ, затем сертификат сервера, затем промежуточную (CA) цепочку. Корневой сертификат не требуется (клиенты уже доверяют ему). Из каталога, содержащего извлечённые файлы, выполните:

cat yourdomain.key yourdomain.crt yourdomain.ca-bundle > servercert.pem

Если ваш CA предоставил промежуточные сертификаты в виде отдельных файлов, а не одного файла .ca-bundle, перечислите каждый из них после сертификата сервера, начиная с листового и заканчивая промежуточным, выпущенным корневым CA:

cat yourdomain.key yourdomain.crt intermediate1.crt intermediate2.crt > servercert.pem

Откройте получившийся файл в текстовом редакторе, чтобы убедиться в правильности структуры. Он должен выглядеть так, с реальными маркерами из пяти дефисов вокруг каждого блока:

-----BEGIN RSA PRIVATE KEY-----
(the text of your private key)
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(the text of your primary SSL certificate)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(the text of the intermediate CA certificate)
-----END CERTIFICATE-----

Более новые ключи могут быть помечены как BEGIN PRIVATE KEY вместо BEGIN RSA PRIVATE KEY; и то, и другое подходит. Ключ не должен быть зашифрован парольной фразой, потому что qmail-smtpd загружает его при запуске без запроса пароля. Если ваш CA выпустил сертификат ECDSA, блок ключа будет обозначен как BEGIN EC PRIVATE KEY; в остальном ничего не меняется.

Шаг 2: Переместите файл в каталог управления Qmail

Имя файла и путь заданы жёстко патчем qmail-tls. Переместите объединённый PEM-файл в каталог управления Qmail и ужесточите его права доступа, так как он содержит ваш приватный ключ:

sudo mv servercert.pem /var/qmail/control/servercert.pem
sudo chmod 600 /var/qmail/control/servercert.pem
sudo chown root:qmail /var/qmail/control/servercert.pem

Владелец и группа зависят от того, под каким пользователем в вашей системе работает qmail-smtpd. В стандартной установке netqmail или notqmail это обычно qmaild или группа qmail, поэтому подойдёт root:qmail с режимом 600. В настройке на основе vpopmail qmail-smtpd работает от имени vpopmail, поэтому используйте:

sudo chown vpopmail:vchkpw /var/qmail/control/servercert.pem
sudo chmod 640 /var/qmail/control/servercert.pem

В любом случае цель одна и та же: процесс qmail-smtpd должен иметь возможность читать файл, и ничто другое не должно.

Шаг 3: Настройка для нестандартных сборок

Большинство разновидностей qmail ищут файл в стандартном расположении, но некоторые используют вместо этого переменные окружения. Определите свою сборку:

  • Стандартный qmail с патчем qmail-tls (netqmail / notqmail / пакеты от поставщиков): дополнительная настройка не требуется. qmail-smtpd автоматически считывает /var/qmail/control/servercert.pem. Чтобы qmail-smtpd анонсировал STARTTLS в ответе EHLO, переменная окружения UCSPITLS должна быть установлена в скрипте запуска qmail-smtpd (обычно /var/qmail/supervise/qmail-smtpd/run): экспортируйте UCSPITLS=»» перед строкой запуска qmail-smtpd. Чтобы требовать шифрование до аутентификации, также установите FORCE_TLS=1.
  • s/qmail с ucspi-ssl: путь к сертификату не задан жёстко. Установите эти переменные окружения в скрипте запуска qmail-smtpd (или в соответствующей обёртке tcpserver / sslserver): CERTFILE для сертификата сервера, KEYFILE для приватного ключа (они могут указывать на один и тот же объединённый PEM-файл) и CERTCHAINFILE для промежуточных сертификатов. Точные названия директив для вашей версии смотрите в документации s/qmail.
  • Фронтенд stunnel (SMTPS на порту 465): укажите в директиве cert stunnel путь /var/qmail/control/servercert.pem и настройте её директиву exec на запуск qmail-smtpd. Этот способ вообще не требует патча qmail-tls; TLS завершается на stunnel.

Если вы не знаете, с каким патчем был собран ваш qmail-smtpd, проверьте бинарный файл:

strings /var/qmail/bin/qmail-smtpd | grep -iE 'tls|starttls|servercert'

Если вы видите упоминания STARTTLS, servercert.pem или UCSPITLS, значит, бинарный файл скомпилирован с патчем qmail-tls.

Шаг 4: Перезапустите Qmail

Qmail считывает сертификат при запуске процесса, поэтому требуется перезапуск qmail-smtpd. В большинстве установок, использующих предоставленные управляющие скрипты:

sudo qmailctl restart

Если ваш дистрибутив оборачивает Qmail в сервис systemd, используйте:

sudo systemctl restart qmail

В настройке daemontools / runit вместо этого отправьте qmail-smtpd сигнал TERM через svc:

sudo svc -t /service/qmail-smtpd

Следите за журналом (обычно /var/log/qmail/smtpd/current) на предмет ошибок при запуске. Неправильно отформатированный PEM-файл или неверные права владения — наиболее частая причина, по которой qmail-smtpd отказывается включать TLS.

Проверьте установку SSL

Убедитесь с помощью OpenSSL, что Qmail предлагает STARTTLS и предоставляет правильный сертификат. Замените mail.yourdomain.com на имя хоста вашего почтового сервера:

openssl s_client -starttls smtp -connect mail.yourdomain.com:25 -servername mail.yourdomain.com </dev/null 
| openssl x509 -noout -issuer -subject -dates

В выводе должны отобразиться субъект (общее имя), издатель (CA) и сроки действия вашего сертификата. Если вместо этого вы настроили SMTPS через stunnel на порту 465, уберите -starttls smtp и подключайтесь напрямую к порту 465:

openssl s_client -connect mail.yourdomain.com:465 -servername mail.yourdomain.com

Найдите строку Verify return code: 0 (ok) в конце процесса рукопожатия. Если вы видите ошибку цепочки, значит, промежуточные сертификаты отсутствуют в servercert.pem: добавьте их и перезапустите qmail-smtpd. Для получения полного отчёта о сертификате, цепочке и поддержке протоколов запустите наш SSL Checker для имени хоста вашего почтового сервера.

Часто задаваемые вопросы

Откуда Qmail считывает SSL сертификат?

Из файла /var/qmail/control/servercert.pem. Этот путь жёстко задан в патче qmail-tls, который добавляет STARTTLS в qmail-smtpd, и тот же путь используется во всех распространённых разновидностях qmail (netqmail, notqmail, пакеты от поставщиков). Файл должен содержать приватный ключ, сертификат сервера и промежуточную цепочку именно в таком порядке. Исключение составляет s/qmail с ucspi-ssl: он вместо этого считывает переменные окружения CERTFILE, KEYFILE и CERTCHAINFILE.

В каком порядке размещать файлы в servercert.pem?

Сначала приватный ключ, затем серверный (листовой) сертификат, затем промежуточный сертификат(ы) CA. Корневой сертификат не требуется, так как почтовые клиенты уже доверяют ему. Достаточно одной команды:
cat yourdomain.key yourdomain.crt yourdomain.ca-bundle > servercert.pem
Если порядок неверен, qmail-smtpd не сможет загрузить сертификат при запуске, и TLS не будет предложен. Если вы подозреваете это, проверьте журнал в /var/log/qmail/smtpd/.

Поддерживает ли стандартный qmail TLS?

Сам по себе — нет. Оригинальный релиз qmail-1.03 от 1998 года не имеет поддержки SSL или TLS. TLS добавляется либо патчем qmail-tls (скомпилированным в бинарный файл qmail-smtpd, добавляет STARTTLS на портах 25 и 587), либо запуском stunnel перед qmail-smtpd для SMTPS на порту 465. Почти каждый современный пакет qmail поставляется с уже применённым патчем qmail-tls, поэтому обычно не нужно патчить исходный код самостоятельно.

Поддерживается ли Qmail до сих пор?

Оригинальный Qmail (qmail-1.03) не обновлялся с 1998 года. Первый форк сообщества, netqmail, выпустил свой последний релиз (1.06) в 2007 году. Активным современным преемником является notqmail, который выпустил версию 1.09 в мае 2024 года и продолжает поставлять исправления ошибок и патчи совместимости с современными системами. Для новых почтовых серверов большинство операторов вместо этого выбирают Postfix или OpenSMTPD, оба из которых имеют встроенную и активно поддерживаемую поддержку TLS.

Почему qmail-smtpd запускается, но не предлагает STARTTLS?

Три распространённые причины. Во-первых, переменная окружения UCSPITLS не экспортируется в скрипте запуска qmail-smtpd: установите UCSPITLS=»» (значение может быть пустым) перед строкой запуска qmail-smtpd и перезапустите службу. Во-вторых, бинарный файл qmail-smtpd был собран без патча qmail-tls: проверьте это с помощью strings /var/qmail/bin/qmail-smtpd | grep -i tls. В-третьих, файл /var/qmail/control/servercert.pem отсутствует, недоступен для чтения пользователю qmail-smtpd или повреждён; проверьте права доступа и порядок PEM-блоков.

Как проверить сертификат после перезапуска Qmail?

Подключитесь к SMTP-порту с помощью OpenSSL и прочитайте сертификат, который Qmail предоставляет через STARTTLS:
openssl s_client -starttls smtp -connect mail.yourdomain.com:25 -servername mail.yourdomain.com </dev/null | openssl x509 -noout -issuer -subject -dates
Это выведет субъект, издателя и сроки действия. Для SMTPS через stunnel на порту 465 уберите флаг -starttls smtp. Убедитесь, что издатель соответствует вашему CA, и что рукопожатие заканчивается сообщением Verify return code: 0 (ok).

Сэкономьте 10% на SSL-сертификатах при заказе сегодня!

Быстрая выдача, надежное шифрование, 99,99% доверия к браузеру, специализированная поддержка и 25-дневная гарантия возврата денег. Код купона: SAVE10

Детальное изображение дракона в полете
Написано

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