Let's Encrypt и Nginx на Ubuntu: сертификат, автоматическое продление и проверка HTTPS

Как работает Let's Encrypt​


Let's Encrypt — центр сертификации, который выдаёт TLS-сертификаты бесплатно через автоматизированный API на основе протокола ACME (Automatic Certificate Management Environment). Ни один этап получения сертификата не требует ручного взаимодействия с веб-сайтом Let's Encrypt: весь процесс происходит между вашим сервером и API.

Для взаимодействия с ACME API на сервере запускается ACME-клиент — программа, которая формирует запрос на выпуск сертификата, доказывает владение доменом и получает подписанный сертификат. Let's Encrypt рекомендует в качестве основного клиента Certbot.

Если ваш хостинг-провайдер уже управляет сертификатами Let's Encrypt самостоятельно, отдельный ACME-клиент не нужен — достаточно проверить документацию провайдера. Самостоятельная настройка требуется, когда вы управляете сервером напрямую и имеете привилегии для запуска команд.

Certbot: рекомендуемый ACME-клиент​


Certbot берёт на себя полный жизненный цикл сертификата: выпуск, установку в веб-сервер, автоматическое продление. Архитектура Certbot построена на плагинах — каждый плагин отвечает за конкретный веб-сервер или метод проверки владения доменом.

Для Nginx существует отдельный плагин, который умеет:

  • автоматически модифицировать конфигурацию Nginx, добавляя SSL-директивы;
  • выполнять проверку владения доменом;
  • перезагружать Nginx после получения сертификата.

Плагин определяет, какой server-блок соответствует запрашиваемому домену, и вносит изменения в конфигурацию. Это избавляет от ручного редактирования конфигов на этапе первичной настройки.

Документация Certbot описывает следующие разделы, релевантные настройке:

  • Getting certificates (and choosing plugins) — как выбрать плагин и получить сертификат;
  • Managing certificates — управление жизненным циклом;
  • Where are my certificates? — расположение файлов на диске;
  • Pre and Post Validation Hooks — хуки до и после валидации;
  • Changing the ACME Server — переключение между staging и production;
  • Configuration file — файл конфигурации Certbot;
  • Log Rotation — управление логами.

Установка через Snap​


Документация Certbot явно рекомендует Snap как способ установки. Snap-пакет содержит все зависимости в изолированном окружении, что исключает конфликты с системными библиотеками Ubuntu и гарантирует актуальную версию Certbot независимо от того, что доступно в apt-репозиториях дистрибутива.

Альтернативные способы установки, перечисленные в документации:

  • Docker;
  • pip;
  • сторонние пакеты дистрибутивов.

Перед установкой через Snap убедитесь, что:

  • snapd установлен и работает (на Ubuntu Server он обычно присутствует по умолчанию);
  • предыдущие версии Certbot, установленные через apt или pip, удалены — одновременное наличие нескольких копий приводит к конфликтам путей и непредсказуемому поведению;
  • у пользователя достаточно привилегий для управления snap-пакетами.

После установки Certbot через Snap становится доступен как системная команда. Точный синтаксис команд и полный список флагов описаны в официальной документации Certbot, раздел «Certbot Commands».

Получение сертификата для Nginx​


Процесс получения сертификата через плагин Nginx выглядит так:

  1. Certbot подключается к ACME API Let's Encrypt и инициирует выпуск сертификата для указанного домена.
  2. API возвращает challenge — задание, которое нужно выполнить для доказательства владения доменом.
  3. Certbot выполняет challenge, используя выбранный плагин.
  4. Если проверка прошла, API выдаёт подписанный сертификат и цепочку промежуточных сертификатов.
  5. Плагин Nginx сохраняет файлы сертификата и модифицирует конфигурацию сервера.

Для успешного прохождения challenge необходимо, чтобы:

  • доменное имя уже указывало на IP-адрес вашего сервера (DNS-запись A или AAAA);
  • веб-сервер был запущен и обслуживал запросы для данного домена;
  • сетевой доступ к серверу не был заблокирован файрволом для входящих HTTP-соединений.

Если хотя бы одно условие не выполнено, challenge завершится ошибкой и сертификат не будет выдан.

Staging-окружение для тестирования​


Let's Encrypt предоставляет отдельный staging API для тестирования. Это важно, потому что production API имеет ограничения на количество операций, и многократные неудачные попытки могут привести к временной невозможности получить сертификат.

Staging-сертификаты не являются доверенными для браузеров, но позволяют отладить весь процесс без риска исчерпать лимиты.

Рекомендация Let's Encrypt: сначала прогоните весь процесс через staging, убедитесь, что конфигурация корректна, и только затем переключайтесь на production API. Переключение между серверами ACME выполняется через конфигурацию Certbot или параметр командной строки — раздел «Changing the ACME Server» документации описывает механизм.

Где хранятся сертификаты​


Certbot сохраняет полученные сертификаты в определённой директории на сервере. Точный путь описан в разделе «Where are my certificates?» документации Certbot. Важно понимать структуру:

  • каждый домен (или набор доменов) образует так называемый lineage — линейку сертификатов;
  • внутри lineage хранятся текущий сертификат, приватный ключ и цепочка;
  • при продлении создаётся новая версия внутри того же lineage, а символические ссылки обновляются на актуальные файлы.

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

Автоматическое продление​


Сертификаты Let's Encrypt имеют ограниченный срок действия, поэтому продление обязательно. Certbot решает задачу продления автоматически: при установке он настраивает механизм периодического запуска команды продления. Конкретный механизм (таймер, cron или иной) зависит от способа установки и версии — детали описаны в разделе «Managing certificates» документации Certbot.

При продлении Certbot:

  1. Проверяет, какие lineage приближаются к истечению.
  2. Для каждого выполняет новый challenge.
  3. Получает обновлённый сертификат.
  4. Обновляет символические ссылки.
  5. Запускает post-validation hook, если он настроен.

Pre и Post Validation Hooks​


Certbot поддерживает хуки — произвольные команды, которые выполняются до или после валидации. Это полезно в нестандартных сценариях:

  • Pre-validation hook — выполняется перед началом challenge. Например, если веб-сервер не запущен постоянно и его нужно стартовать только на время проверки.
  • Post-validation hook — выполняется после успешного получения или продления сертификата. Типичный случай: перезагрузка Nginx, чтобы он подхватил новый сертификат.

Хуки настраиваются в конфигурационном файле Certbot или передаются как параметры командной строки. Раздел «Pre and Post Validation Hooks» документации Certbot описывает синтаксис и порядок выполнения.

Конфигурация Nginx для HTTPS​


После получения сертификата Nginx должен быть сконфигурирован для обслуживания HTTPS-трафика. Если вы использовали плагин Certbot для Nginx, большая часть конфигурации будет добавлена автоматически. Тем не менее стоит понимать, что происходит:

  • в server-блоке появляются директивы, указывающие на файлы сертификата и приватного ключа;
  • добавляется listen-директива для HTTPS;
  • при необходимости настраивается редирект с HTTP на HTTPS.

Если вы предпочитаете управлять конфигурацией вручную, вам нужно самостоятельно указать пути к файлам сертификата в соответствующих SSL-директивах server-блока Nginx. Пути к файлам можно узнать из вывода Certbot или из раздела «Where are my certificates?» документации.

Ubuntu Server включает Nginx в раздел «Web servers» своей официальной документации, где описаны базовые принципы конфигурации.

Проверка результата​


После настройки убедитесь, что HTTPS работает корректно:

  1. Проверка в браузере. Откройте сайт по HTTPS. Браузер не должен показывать предупреждений о недействительном сертификате. Если используется staging-сертификат, предупреждение будет — это ожидаемо.
  2. Проверка цепочки. Убедитесь, что сервер отдаёт полную цепочку сертификатов, а не только конечный сертификат. Неполная цепочка приводит к ошибкам на некоторых клиентах, особенно мобильных.
  3. Проверка редиректа. Если вы настроили перенаправление с HTTP на HTTPS, убедитесь, что оно работает и не создаёт циклов.
  4. Проверка продления. Запустите команду продления Certbot в тестовом режиме (dry run), чтобы убедиться, что автоматическое продление настроено корректно и не завершится ошибкой.

Типичные проблемы и их причины​


| Симптом | Вероятная причина |
|---------|-------------------|
| Challenge не проходит, таймаут | Сетевой доступ к серверу заблокирован файрволом или DNS ещё не обновился |
| Challenge не проходит, ошибка на стороне сервера | Nginx не обслуживает запросы для данного домена или конфигурация некорректна |
| Браузер показывает «сертификат недействителен» | Использован staging-сертификат или цепочка неполная |
| Продление не срабатывает | Nginx не был перезапущен после продления, или хук не настроен |
| Конфликт при установке | Старая версия Certbot из apt не удалена перед установкой Snap-версии |
| Certbot не находит server-блок | Домен не указан в конфигурации Nginx или server_name не совпадает |

Ограничения Let's Encrypt​


  • Production API имеет ограничения на количество операций. Точные значения опубликованы в документации Let's Encrypt. Используйте staging для отладки.
  • Wildcard-сертификаты требуют иного метода проверки владения доменом, отличного от стандартного HTTP-challenge. Плагин Nginx сам по себе не покрывает этот сценарий; для wildcard-сертификатов нужны DNS-плагины или ручная настройка.
  • Certbot-Auto, ранее популярный способ установки, помечен как deprecated в документации. Используйте Snap или альтернативные методы.

Итоговый порядок действий​


  1. Убедитесь, что DNS-запись домена указывает на сервер и входящий HTTP-доступ не заблокирован.
  2. Удалите предыдущие версии Certbot, если они установлены через apt или pip.
  3. Установите Certbot через Snap.
  4. Запустите получение сертификата через staging API и проверьте, что challenge проходит.
  5. Переключитесь на production API и получите реальный сертификат.
  6. Проверьте, что Nginx обслуживает HTTPS без ошибок.
  7. Убедитесь, что автоматическое продление настроено.
  8. Настройте post-validation hook для перезагрузки Nginx при продлении.
  9. Периодически проверяйте логи Certbot — раздел «Log Rotation» документации описывает, где они хранятся и как управляются.

Источники​


 
Назад
Верх Низ