Как настроить автоматическое обновление сертификатов Let’s Encrypt, чтобы не потерять HTTPS

Как настроить автоматическое обновление сертификатов Let’s Encrypt, чтобы не потерять HTTPS

Представь: ты настроил HTTPS на своём сайте, всё работает, браузер показывает зелёный замочек. Через три месяца — внезапно сайт перестал открываться. Пользователи видят предупреждение «Сертификат недействителен». Ты лезешь в панель — оказалось, Let’s Encrypt автоматически истёк, а ты забыл про него. Это не редкость. И это легко предотвратить.

Let’s Encrypt выдаёт сертификаты на 90 дней. Это не ошибка — так задумано: короткий срок повышает безопасность, но требует автоматизации. Если ты не настроил обновление — ты рискуешь. Не потому что «надо», а потому что HTTPS — это не опция, а базовая инфраструктура. Как ток в розетке: не замечаешь, пока не пропал.

В этой статье — только то, что нужно сделать, чтобы сертификаты обновлялись сами. Без воды, без теории про PKI и цепочки доверия. Только шаги, которые работают на реальных серверах.

Как это работает: три ключевых элемента

Автоматическое обновление — не волшебство. Это три простых части:

  • Клиент — программа, которая запрашивает новый сертификат. Чаще всего это certbot.
  • Планировщик — система, которая запускает клиента в нужный момент. Обычно это cron или systemd timer.
  • Перезагрузка веб-сервера — после обновления сертификата нужно перезагрузить nginx или Apache, чтобы он начал использовать новый файл.

Если хотя бы один из этих элементов сломан — сертификат не обновится. И сайт упадёт.

Шаг за шагом: как настроить автоматическое обновление

Допустим, у тебя Ubuntu 22.04, nginx и сайт доступен по домену example.com. Ты уже получил сертификат через certbot — это значит, что он установлен и работает. Теперь настраиваем автоматику.

  1. Проверь, установлен ли certbot
    В терминале введи:
    certbot --version

    Если видишь что-то вроде certbot 2.7.0 — всё ок. Если нет — установи:

    sudo apt update && sudo apt install certbot python3-certbot-nginx
  2. Проверь, есть ли у тебя активный сертификат
    Введи:

    sudo certbot certificates

    Убедись, что в списке есть твой домен и статус — VALID. Если сертификат не найден — сначала его нужно получить, а потом возвращайся сюда.

  3. Протестируй обновление вручную
    Это критично. Запусти:

    sudo certbot renew --dry-run

    Если видишь Congratulations, all simulated renewals succeeded — отлично. Если есть ошибки — разбирай их сейчас, а не через 80 дней. Частая причина: nginx не запущен, порт 80/443 занят, DNS не прописан.

  4. Настрой автоматический запуск
    Certbot автоматически создаёт задачу для cron. Проверь её:

    sudo cat /etc/cron.d/certbot

    Там должна быть строка вроде:

    0 12 * * * root test -x /usr/bin/certbot && perl -e 'sleep int(rand(3600))' && certbot -q renew

    Это значит: каждый день в 12:00 проверяется, нужно ли обновить сертификаты. Если да — обновляет. Плюс случайная задержка до часа, чтобы не перегружать серверы Let’s Encrypt.

  5. Убедись, что веб-сервер перезагружается после обновления
    Certbot умеет автоматически перезагружать nginx или Apache, но только если ты указал это при первом получении сертификата. Проверь:

    sudo nano /etc/letsencrypt/renewal/example.com.conf

    В файле должен быть блок:

    [renewalparams]
    authenticator = nginx
    installer = nginx

    Если вместо installer = nginx стоит installer = none — это плохо. Сертификат обновится, но nginx не перезагрузится, и HTTPS сломается. Исправь:

    sudo certbot --nginx --cert-name example.com

    И выбери опцию «перезагрузить nginx» при перенастройке.

  6. Проверь, что всё работает
    Запусти обновление вручную:

    sudo certbot renew

    Если не было ошибок — сертификаты обновились. Проверь даты:

    sudo certbot certificates

    Даты окончания должны сдвинуться на +90 дней.

Что делать, если у тебя не nginx или не Ubuntu?

Система может быть любой: CentOS, Debian, FreeBSD, Docker — но принцип один. Разница только в деталях.

Среда Клиент Как проверить задачу Как перезагрузить сервер
Ubuntu / Debian (nginx) certbot cat /etc/cron.d/certbot sudo systemctl reload nginx
CentOS / RHEL (nginx) certbot systemctl list-timers | grep certbot sudo systemctl reload nginx
Docker (nginx) certbot (в отдельном контейнере) docker exec certbot-container crontab -l Перезагрузи контейнер nginx: docker-compose restart nginx
Apache на Ubuntu certbot cat /etc/cron.d/certbot sudo systemctl reload apache2
Cloudflare (DNS-валидация) certbot + плагин certbot certificates Перезагружай веб-сервер вручную или через скрипт

Если ты используешь Cloudflare, AWS Route53 или другой DNS-провайдер — тебе нужен плагин для DNS-валидации. Например:
python3-certbot-dns-cloudflare. Установи его, добавь API-ключ в файл /etc/letsencrypt/cloudflare.ini, и в команде получения сертификата укажи:
certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d example.com

После этого автоматическое обновление будет работать так же — через cron и перезагрузку сервера.

Частые ошибки — и как их избежать

  • Ошибка: «No such file or directory» при обновлении
    Причина: ты удалил файлы сертификатов вручную, или изменил путь к ним. Решение: не трогай папки /etc/letsencrypt без понимания, что делаешь. Это системные файлы — не «мусор».
  • Ошибка: «Port 80 is already in use»
    Причина: certbot пытается проверить домен через HTTP-челлендж, но порт занят другим процессом (например, другим nginx или прокси). Решение: останови лишние сервисы перед обновлением, или используй DNS-валидацию.
  • Ошибка: «The client lacks sufficient authorization»
    Причина: DNS-записи не прописаны, или не обновились. Проверь через dig example.com — если IP не совпадает с твоим сервером — жди 5–10 минут или пропиши вручную.
  • Ошибка: сертификат обновился, но сайт всё ещё показывает старый
    Причина: nginx не перезагрузился. Проверь: sudo systemctl status nginx — если статус «active», но сертификат не обновился, значит, installer = none в конфиге. Исправь, как описано выше.
  • Ошибка: certbot не запускается по расписанию
    Причина: cron не работает. Проверь: sudo systemctl status cron. Если «inactive» — включи: sudo systemctl enable --now cron.

Когда что выбирать

Ты не один. И твоя ситуация может отличаться. Вот как действовать в разных случаях:

  • Если ты один человек, управляешь одним сайтом на VPS
    — Используй certbot + nginx. Установи через пакетный менеджер. Не трогай настройки. Пусть всё делает автоматически. Проверяй раз в месяц: sudo certbot certificates.
  • Если у тебя несколько сайтов, разные домены
    — Добавляй все домены в один сертификат через -d site1.com -d site2.com. Так ты получаешь один сертификат на несколько доменов — и обновляешь его раз в 90 дней, а не по три раза.
  • Если сайт в Docker, а certbot — на хосте
    — Не запускай certbot внутри контейнера. Лучше: запускай его на хосте, а сертификаты монтируй в контейнер nginx как volume. Пример:
    -v /etc/letsencrypt:/etc/letsencrypt

    Тогда nginx внутри контейнера будет видеть обновлённые файлы без пересборки.

  • Если ты используешь CDN (Cloudflare, CloudFront)
    — Не используй HTTP-валидацию. Она не сработает, потому что трафик идёт через CDN. Используй DNS-валидацию. Установи плагин, пропиши ключ API — и всё будет работать.
  • Если ты не уверен, что у тебя всё настроено
    — Запусти sudo certbot renew --dry-run прямо сейчас. Если ошибка — не жди 80 дней. Исправляй сейчас. Это занимает 10 минут. А если не исправишь — сайт упадёт без предупреждения.

Как лучше сделать: проверка и мониторинг

Автоматизация — это хорошо. Но даже автоматизация может сломаться. Поэтому:

  • Проверяй сертификаты раз в месяц: sudo certbot certificates. Смотри на даты окончания. Если они меньше 30 дней — значит, обновление не сработало.
  • Настрой уведомление. Например, добавь в cron задачу, которая раз в неделю проверяет дату окончания и шлёт email, если осталось меньше 15 дней:
    0 8 * * 1 [ (openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate | cut -d= -f2) -lt(date -d "15 days" +%Y%m%d) ] && echo "Сертификат example.com истекает через 15 дней" | mail -s "Срочно: сертификат" admin@example.com
  • Используй внешний мониторинг: например, UptimeRobot или Healthchecks.io. Настрой проверку HTTPS-статуса. Если сайт перестанет открываться — ты получишь уведомление, даже если не сидишь в терминале.

Что делать, если всё сломалось

Сертификат истёк. Сайт не открывается. Что делать?

  1. Проверь, есть ли доступ к серверу через SSH.
  2. Запусти: sudo certbot renew --force-renewal
  3. Если выдаёт ошибку — смотри, в чём она. Чаще всего: nginx не запущен → запусти: sudo systemctl start nginx.
  4. Если DNS не прописан — исправь его в панели хостинга.
  5. После успешного обновления: sudo systemctl reload nginx.
  6. Проверь сайт в браузере — замочек должен появиться.

После этого — вернись к настройке автоматического обновления. Не просто «сделал и забыл» — проверь, что cron работает, что installer = nginx, что порт 80 свободен.

Рекомендации: как не попасть в ловушку

  • Никогда не удаляй папку /etc/letsencrypt. Это не кэш — это твои ключи и сертификаты.
  • Не используй ручное обновление через certbot certonly без --dry-run. Ты можешь получить лимит на запросы — и не сможешь получить новый сертификат 7 дней.
  • Не отключай cron. Даже если «всё работает». Сертификаты — не то, что можно игнорировать.
  • Не используй самоподписанные сертификаты для продакшена. Они не работают в браузерах. Let’s Encrypt — бесплатный, автоматический, доверенный.
  • Если ты используешь облачный хостинг (например, AWS, Hetzner, DigitalOcean) — проверь, не блокирует ли он порт 80 по умолчанию. Иногда брандмауэр мешает проверке.

Самый важный совет: тестировать обновление — не раз в три месяца, а сразу после настройки. Если ты не проверил certbot renew --dry-run — ты не настроил автоматику. Ты просто надеешься.

Итог: что делать прямо сейчас

Ты не должен знать, как работает TLS. Ты должен знать, что HTTPS работает. Вот твой чек-лист на сегодня:

  1. Зайди на сервер через SSH.
  2. Введи: sudo certbot certificates — убедись, что сертификаты есть и валидны.
  3. Введи: sudo certbot renew --dry-run — если есть ошибки — исправь их сейчас.
  4. Открой: sudo nano /etc/letsencrypt/renewal/твой_домен.conf — убедись, что есть строка installer = nginx (или apache).
  5. Проверь: sudo systemctl status cron — если не active, включи: sudo systemctl enable --now cron.
  6. Запусти: sudo certbot renew — если всё прошло без ошибок — ты в безопасности.

После этого — забудь про сертификаты. Они будут обновляться сами. Ты не должен вспоминать о них до тех пор, пока не увидишь уведомление: «Сертификат истекает через 15 дней». И даже тогда — это просто напоминание. Ты уже сделал всё правильно.

Информация в этой статье носит ознакомительный характер. Настройка веб-сервера и сертификатов требует понимания инфраструктуры. Если ты не уверен — обратись к системному администратору или специалисту по безопасности.

Dfncfg.ru