Как работает 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 выглядит так:
- Certbot подключается к ACME API Let's Encrypt и инициирует выпуск сертификата для указанного домена.
- API возвращает challenge — задание, которое нужно выполнить для доказательства владения доменом.
- Certbot выполняет challenge, используя выбранный плагин.
- Если проверка прошла, API выдаёт подписанный сертификат и цепочку промежуточных сертификатов.
- Плагин 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:
- Проверяет, какие lineage приближаются к истечению.
- Для каждого выполняет новый challenge.
- Получает обновлённый сертификат.
- Обновляет символические ссылки.
- Запускает 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 работает корректно:
- Проверка в браузере. Откройте сайт по HTTPS. Браузер не должен показывать предупреждений о недействительном сертификате. Если используется staging-сертификат, предупреждение будет — это ожидаемо.
- Проверка цепочки. Убедитесь, что сервер отдаёт полную цепочку сертификатов, а не только конечный сертификат. Неполная цепочка приводит к ошибкам на некоторых клиентах, особенно мобильных.
- Проверка редиректа. Если вы настроили перенаправление с HTTP на HTTPS, убедитесь, что оно работает и не создаёт циклов.
- Проверка продления. Запустите команду продления 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 или альтернативные методы.
Итоговый порядок действий
- Убедитесь, что DNS-запись домена указывает на сервер и входящий HTTP-доступ не заблокирован.
- Удалите предыдущие версии Certbot, если они установлены через apt или pip.
- Установите Certbot через Snap.
- Запустите получение сертификата через staging API и проверьте, что challenge проходит.
- Переключитесь на production API и получите реальный сертификат.
- Проверьте, что Nginx обслуживает HTTPS без ошибок.
- Убедитесь, что автоматическое продление настроено.
- Настройте post-validation hook для перезагрузки Nginx при продлении.
- Периодически проверяйте логи Certbot — раздел «Log Rotation» документации описывает, где они хранятся и как управляются.
