08-certbot — Certbot (Let's Encrypt) + nginx-плагин
☐ Опциональный. Ставит Certbot и nginx-плагин для бесплатных TLS-сертификатов Let's Encrypt и включает таймер автопродления. Сами сертификаты выпускаются по требованию командой
mitdev ssl <домен>.
Зачем нужен
Certbot — клиент центра сертификации Let's Encrypt, который бесплатно выдаёт TLS-сертификаты (для HTTPS). Модуль:
- ставит
certbotи плагинpython3-certbot-nginx(умеет сам править конфиг nginx под HTTPS); - включает systemd-таймер, который автоматически продлевает сертификаты до истечения срока.
Важно: при установке модуля сертификаты не выпускаются. Выпуск — отдельная операция mitdev ssl <домен>, потому что для неё нужен реальный домен, уже указывающий на этот сервер.
Когда включать и когда не нужен
Включайте, если сайту нужен HTTPS по собственному домену (почти любой продакшен).
Не нужен, если:
- у сервера нет публичного домена (только IP или внутренняя сеть) — Let's Encrypt не выдаёт сертификаты на IP;
- HTTPS терминируется где-то ещё (внешний балансировщик, CDN, ingress Kubernetes).
Зависимости и требования
- Требует модуль
06-nginx— интеграция и выпуск идут через nginx-плагин (certbot --nginx). Установщик добавит nginx автоматически. - На семействе RHEL пакеты берутся из репозитория EPEL — модуль подключает его сам (
os_ensure_epel). - Для фактического выпуска сертификата (
mitdev ssl) нужны:- реальный домен;
- A-запись DNS, указывающая на публичный IP этого сервера;
- открытый порт 80 — Let's Encrypt проверяет владение доменом через HTTP-01 challenge (кладёт файл в
/.well-knownи запрашивает его по HTTP).
Что именно делает (по шагам module_install)
- Готовит репозитории: на RHEL подключает EPEL (
os_ensure_epel); на прочих семействах — no-op. - Ставит пакеты
certbotиpython3-certbot-nginx. - Включает таймер автопродления. Debian ставит юнит
certbot.timer, EPEL на RHEL —certbot-renew.timer; модуль выбирает существующий и делаетsystemctl enable --now. Если таймер уже активен — просто сообщает об этом. - Тестовый прогон продления:
certbot renew --dry-run(пока сертификатов нет — это нормально, шаг не считается ошибкой). - Выполняет
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) |
пусто → --register-unsafely-without-email |
уведомления Let's Encrypt об истечении | желательно указывать в продакшене |
Как переопределить настройки
- Email и домен передаются аргументами:
mitdev ssl example.com [email protected](без аргументов мастер спросит их интерактивно). - Отдельных экспортируемых переменных у модуля нет.
Проверка, что всё работает
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.
Безопасность и продакшен
- Сертификаты Let's Encrypt живут 90 дней; автопродление через
certbot.timerобязательно — не отключайте его. - Указывайте email при выпуске: на него придёт предупреждение, если автопродление вдруг перестанет работать.
mitdev sslвключает--redirect(HTTP→HTTPS) — весь трафик уходит на защищённое соединение.- Приватные ключи в
/etc/letsencryptдоступны только root — не копируйте их в мир. Резервная копия/etc/letsencryptвходит вmitdev backup.
Откат и удаление
Автоматический откат (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 только при окончательном выводе сервера из эксплуатации.
См. также
- ../COMMANDS.md — команда
mitdev ssl - 06-nginx.md — веб-сервер, на который опирается выпуск
- 09-firewall.md — открытие порта 80 для HTTP-01 challenge
- ../SECURITY.md — HTTPS и модель безопасности
- ../TROUBLESHOOTING.md — разбор проблем с сертификатами