НейроАгент

Почему mailcow не выдает SSL сертификат? Полное руководство

Устраните проблемы с SSL-сертификатами в mailcow: NAT reflection, проброс портов, конфигурация reverse proxy. Пошаговые инструкции и решения.

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

НейроАгент

Mailcow не выдает SSL-сертификат чаще всего из-за проблем с NAT reflection, неправильной конфигурации проброса портов или конфликтов с обратными прокси. Основные причины включают отказ Let’s Encrypt в проверке домена из-за сетевых проблем, неправильную привязку портов в конфигурации mailcow или отсутствие корректной маршрутизации для ACME-челленджей.

Содержание

Основные причины SSL-проблем в mailcow

NAT reflection является наиболее частой причиной проблем с SSL-сертификатами в mailcow. Когда сервер находится за маршрутизатором с NAT, Let’s Encrypt не может проверить владение доменом, потому что не может достучаться до сервера извне через проброс портов.

В большинстве случаев HTTP-проверка пропускается для обхода неизвестных проблем с NAT reflection, которые не решаются игнорированием этой конкретной сетевой ошибки

Другая распространенная проблема - неправильная привязка портов в конфигурации mailcow. Если вы используете нестандартные порты (например, HTTP_PORT=82), это может вызывать конфликты с системными настройками и мешать работе ACME-клиента.

Проблемы также возникают при:

  • Отсутствии корректной маршрутизации портов 80 и 443
  • Использовании одних и тех же портов на нескольких устройствах
  • Некорректной настройке файрвола или прокси-сервера

Проблемы с NAT reflection и портами

NAT reflection возникает, когда сервер пытается связаться сам с собой через внешний IP, но маршрутизатор не правильно обрабатывает такой трафик. Для mailcow это критически важно, так как Let’s Encrypt должен иметь возможность достучаться до вашего сервера снаружи.

Симптомы NAT reflection:

  • Сертификаты не обновляются
  • Появляются ошибки проверки домена
  • TLSA-записи не генерируются корректно

Если вы столкнулись с проблемами генерации TLSA-записей в обзоре DNS внутри mailcow, скорее всего, у вас есть проблемы с NAT reflection, которые нужно исправить

Для решения проблемы с NAT reflection необходимо:

  1. Убедитесь, что порты 80 и 443 правильно проброшены на ваш сервер
  2. Проверьте, что маршрутизатор поддерживает hairpin NAT
  3. В крайних случаях можно временно отключить HTTP-проверку в конфигурации mailcow

Конфигурация проброса портов

Правильная конфигурация проброса портов - ключ к решению SSL-проблем. Mailcow требует доступность портов:

  • TCP 80 - для HTTP-челленджей Let’s Encrypt
  • TCP 443 - для HTTPS-челленджей
  • TCP 25, 465, 587, 143, 993, 110, 995 - для почтовых сервисов

Пример конфигурации iptables для NAT:

bash
# Проброс порта 25 (SMTP)
iptables -t nat -I PREROUTING -p tcp --dport 25 -d $WAN_IP -j DNAT --to $SERVER_IP:25

# Проброс порта 443 (HTTPS)
iptables -t nat -I PREROUTING -p tcp --dport 443 -d $WAN_IP -j DNAT --to $SERVER_IP:443

Важно: При использовании обратного прокси (nginx, Traefik) необходимо правильно настроить прокси-челленджи для Let’s Encrypt

Если вы используете нестандартные порты (как в вашем случае с HTTP_PORT=82), убедитесь, что:

  1. Порт 80 все равно доступен для ACME-челленджей
  2. Конфигурация mailcow правильно указана в mailcow.conf
  3. Нет конфликтов с другими службами

Проверка и устранение неполадок

Для диагностики SSL-проблем в mailcow выполните следующие шаги:

1. Проверка статуса SSL

bash
docker compose logs acme-mailcow

Ищите ошибки в логах ACME-клиента, такие как:

  • validation failed
  • connection timeout
  • domain not resolved

2. Проверка доступности портов

bash
# Проверка доступности извне
curl -v http://ваш-домен/.well-known/acme-challenge/test

# Проверка доступности изнутри
curl -v http://localhost/.well-known/acme-challenge/test

3. Сброс SSL-конфигурации

Если все проверки пройдены, но проблема остается:

bash
# Остановка ACME-сервиса
docker compose stop acme-mailcow

# Удаление старых сертификатов
rm -rf data/assets/ssl/*

# Перезапуск
docker compose start acme-mailcow

Согласно документации mailcow, остановка acme-mailcow на день-два, удаление папки data/assets/ssl и перезапуск может решить многие проблемы с сертификатами

Дополнительные решения

Использование внешних сертификатов

Если Let’s Encrypt не работает, можно использовать:

  1. Существующие сертификаты - просто скопуйте их в data/assets/ssl/
  2. Сертификаты от других CA - настройте ручную установку
  3. Сертификаты от nginx-proxy - как предложил один из пользователей:

Чтобы решить эту проблему, я создал символьную ссылку на папку /data/assets/ssl в папку, где хранятся все мои сертификаты (и обновляются nginx-proxy), и создал три символические ссылки там, чтобы получить правильные имена файлов для dovecot и postfix

Конфигурация reverse proxy

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

  1. Убедитесь, что прокси правильно перенаправляет /.well-known/acme-challenge/
  2. Настройте SNI для поддержки нескольких доменов
  3. Проверьте соответствие путей к сертификатам

Если вы включите TLS SNI (ENABLE_SSL_SNI в mailcow.conf), пути к сертификатам в вашем обратном прокси должны соответствовать правильным путям в data/assets/ssl/

Множественные сертификаты

Для поддержки нескольких доменов на одном сертификате:

bash
# В mailcow.conf
ADDITIONAL_SAN=imap.*,smtp.*,autoconfig.*,autodiscover.*

Это расширит сертификат до “imap.example.com”, “smtp.example.com”, “autoconfig.example.com”, “autodiscover.example.com

Источники

  1. Advanced SSL - mailcow: dockerized documentation
  2. Mailcow SSL not working - Server Fault
  3. Fresh install of mailcow, SSL certificate not working - mailcow community
  4. Fresh Installed, https & ssl not working - GitHub issue
  5. SSL certificate issues - GitHub issue
  6. Email Certificate Problem - Reddit
  7. Docker Mailcow: How to renew the certificate - Server Fault

Заключение

Основные причины, по которым mailcow не выдает SSL-сертификат:

  1. Проблемы с NAT reflection - самая частая причина, требующая настройки hairpin NAT или проброса портов
  2. Неправильная конфигурация портов - особенно при использовании нестандартных портов для HTTP
  3. Конфликты с обратными прокси - неправильная настройка перенаправления ACME-челленджей

Рекомендуемые действия:

  • Проверьте логи ACME-клиента через docker compose logs acme-mailcow
  • Убедитесь в доступности портов 80 и 443 снаружи
  • При необходимости сбросьте SSL-конфигурацию через удаление папки data/assets/ssl
  • Рассмотрите использование внешних сертификатов как временное решение

Если проблема persists, предоставьте больше информации о вашей сетевой конфигурации и содержимое логов для более точной диагностики.