08-certbot — Certbot (Let's Encrypt) + nginx-плагин

☐ Опциональный. Ставит Certbot и nginx-плагин для бесплатных TLS-сертификатов Let's Encrypt и включает таймер автопродления. Сами сертификаты выпускаются по требованию командой mitdev ssl <домен>.

Зачем нужен

Certbot — клиент центра сертификации Let's Encrypt, который бесплатно выдаёт TLS-сертификаты (для HTTPS). Модуль:

Важно: при установке модуля сертификаты не выпускаются. Выпуск — отдельная операция mitdev ssl <домен>, потому что для неё нужен реальный домен, уже указывающий на этот сервер.

Когда включать и когда не нужен

Включайте, если сайту нужен HTTPS по собственному домену (почти любой продакшен).

Не нужен, если:

Зависимости и требования

Что именно делает (по шагам module_install)

  1. Готовит репозитории: на RHEL подключает EPEL (os_ensure_epel); на прочих семействах — no-op.
  2. Ставит пакеты certbot и python3-certbot-nginx.
  3. Включает таймер автопродления. Debian ставит юнит certbot.timer, EPEL на RHEL — certbot-renew.timer; модуль выбирает существующий и делает systemctl enable --now. Если таймер уже активен — просто сообщает об этом.
  4. Тестовый прогон продления: certbot renew --dry-run (пока сертификатов нет — это нормально, шаг не считается ошибкой).
  5. Выполняет module_verify и печатает версию Certbot и подсказку «Выпуск сертификата: mitdev ssl <домен>».

Как выпускается сертификат (mitdev ssl)

Команда mitdev ssl <домен> [email] выполняет:

certbot --nginx -d <домен> --agree-tos --non-interactive --redirect \
        -m <email>              # либо --register-unsafely-without-email, если email не задан

--nginx правит конфиг сайта, --redirect добавляет автоматический редирект HTTP→HTTPS. После успеха HTTPS сразу активен.

Файлы, службы и порты

Путь / юнит Назначение Права
certbot.timer / certbot-renew.timer таймер автопродления сертификатов root
certbot.service задача продления, запускается таймером root
/etc/letsencrypt/live/<домен>/ активные сертификаты (fullchain.pem, privkey.pem) root
/etc/letsencrypt/renewal/ параметры продления по каждому домену root
/var/lib/letsencrypt рабочее состояние ACME root
/var/log/letsencrypt/letsencrypt.log лог выпуска/продления root
порт 80/tcp нужен для HTTP-01 challenge при выпуске

Настройка

У модуля нет собственных переменных в config/defaults.conf. Параметры выпуска задаются в момент вызова mitdev ssl:

Параметр Значения По умолчанию Влияние Когда указывать
<домен> (арг. 1) FQDN — (спросит) для какого домена сертификат всегда
[email] (арг. 2) email пусто → --register-unsafely-without-email уведомления Let's Encrypt об истечении желательно указывать в продакшене

Как переопределить настройки

Проверка, что всё работает

module_verify: команда certbot есть и certbot --version отрабатывает.

Проверка автопродления и сертификатов:

certbot --version                     # certbot 2.x.x
systemctl list-timers | grep certbot  # таймер присутствует, видно время следующего запуска
certbot renew --dry-run               # тестовое продление без реальных изменений — «Congratulations…»
certbot certificates                  # список выпущенных сертификатов и даты истечения
mitdev doctor                         # строка «SSL-автопродление … certbot.timer активен»

Ожидаемо: таймер активен, --dry-run проходит, certbot certificates показывает ваши домены со сроком «VALID».

Типовые задачи

# Выпустить сертификат и включить HTTPS для домена
mitdev ssl example.com [email protected]

# Несколько доменов — по одному вызову на каждый
mitdev ssl api.example.com [email protected]

# Проверить, что автопродление настроено
systemctl list-timers | grep certbot

# Тестовое продление (ничего не меняет, проверяет работоспособность)
sudo certbot renew --dry-run

# Принудительно продлить сейчас (обычно не нужно — таймер сам)
sudo certbot renew

# Посмотреть все сертификаты и сроки
sudo certbot certificates

Частые ошибки

Симптом: mitdev ssl завершается ошибкой, в логе — «Timeout … Fetching http://домен/.well-known/...». Причина: домен не указывает на этот сервер, либо порт 80 закрыт файрволом. Решение:

dig +short example.com                # должен вернуть IP этого сервера
mitdev firewall status | grep 80      # порт 80 должен быть разрешён
# сравните с публичным IP:
curl -s ifconfig.me

Симптом: «too many certificates already issued» / «rate limit». Причина: превышены лимиты Let's Encrypt (около 5 выпусков на один набор доменов в неделю, 50 сертификатов на зарегистрированный домен в неделю). Решение: дождитесь сброса лимита; для отладки используйте --dry-run (он лимиты не тратит).

Симптом: mitdev doctor пишет «certbot.timer не активен». Причина: таймер выключен. Решение: sudo systemctl enable --now certbot.timer.

Симптом: сертификат выпущен, но браузер показывает старый/самоподписанный. Причина: nginx не перезагружен или сайт использует другой конфиг. Решение: mitdev nginx reload; проверьте, что домен обслуживает нужный vhost.

Безопасность и продакшен

Откат и удаление

Автоматический откат (module_rollback): удаляет пакеты certbot и python3-certbot-nginx.

Ручное удаление:

# Удалить certbot, СОХРАНИВ выпущенные сертификаты (живой сайт продолжит работать)
mitdev remove certbot

# Полное удаление ВМЕСТЕ со всеми сертификатами и аккаунтами Let's Encrypt
mitdev remove certbot --purge

Удаление отключает таймер автопродления. Без --purge каталоги /etc/letsencrypt, /var/lib/letsencrypt, /var/log/letsencrypt сохраняются (сайту с HTTPS они ещё нужны); с --purge — удаляются. Удаляйте с --purge только при окончательном выводе сервера из эксплуатации.

См. также