ADG Оставить заявку
Блог Инфраструктура 4 мин чтения

Let's Encrypt закрытая бета: первый бесплатный сертификат через letsencrypt-auto

Попали в закрытую бету Let's Encrypt, выпустили первый сертификат через letsencrypt-auto и настроили автоматическое обновление через cron. Внутренние сервисы пока на своём CA.

Контекст момента

Let's Encrypt открывает закрытую бету - первые бесплатные автоматические TLS-сертификаты выдаются реальным участникам

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

Что такое закрытая бета и чем отличается от «просто сертификата»

Let's Encrypt - это Certificate Authority, который выдаёт сертификаты бесплатно и автоматически через ACME-протокол. Никакого личного кабинета, никакого подтверждения по email от менеджера CA, никакой PDF-формы. Клиент (letsencrypt-auto) сам генерирует ключ, формирует запрос, договаривается с CA о доменной валидации, получает сертификат и кладёт его на место.

Закрытая бета - это не «можно попробовать если постараться», а реальные приглашения конкретным доменам. Заявка подаётся через форму на letsencrypt.org, указываешь домен, ждёшь. Нам пришло через три недели.

Как выглядит первый запуск

Установка letsencrypt-auto - это склонировать репозиторий или скачать скрипт. Он сам устанавливает зависимости через pip во временное virtualenv-окружение. Выглядит немного пугающе, но работает.

Первый запуск:

./letsencrypt-auto certonly --webroot \
  -w /var/www/example.ru \
  -d example.ru -d www.example.ru \
  --agree-tos \
  --email admin@example.ru

Флаг --webroot означает, что certbot кладёт временный файл валидации в директорию сайта, а сервер Let's Encrypt его проверяет по HTTP. Никаких изменений в DNS, никаких прав root для nginx - просто файл в /.well-known/acme-challenge/.

Прошло секунд тридцать - и в /etc/letsencrypt/live/example.ru/ появились четыре файла: cert.pem, chain.pem, fullchain.pem, privkey.pem. Структура знакомая, названия совпадают с тем что мы уже использовали в nginx-конфигах. Поменяли пути - перезапустили nginx - всё работает. Браузер показывает замок, ssllabs.com даёт A.

Сертификат действует 90 дней. Специально так сделано: короткий срок = меньше времени у скомпрометированного сертификата, и это нормально пока обновление автоматическое.

Автоматическое обновление через cron

letsencrypt-auto умеет команду renew - она проверяет все выданные сертификаты и обновляет те, у которых осталось меньше 30 дней. Добавили в cron:

0 3 * * 1 /usr/local/bin/letsencrypt-auto renew --quiet && nginx -s reload

Каждый понедельник в 3 ночи. Тихий режим - нет вывода если всё хорошо. После обновления - reload nginx. Ни одного ручного действия не требуется.

Это принципиально другая ситуация по сравнению с тем, что мы делали раньше. Раньше - скрипт проверяет, письмо инженеру за 30 дней, инженер заходит в личный кабинет CA, платит, скачивает, раскладывает. Теперь - ничего этого нет. Сертификат живёт и обновляется сам.

Один нюанс: nginx -s reload должен выполняться под пользователем с нужными правами. Мы запускаем cron от root для этой задачи, что не идеально, но для начала терпимо. Аккуратнее было бы через sudo с ограниченными правами только на reload - оставили на следующую итерацию.

Где не используем

Для публичных сайтов клиентов - однозначно да, это именно то что нужно. Для внутренних сервисов - API-сервисы, мониторинг, внутренние веб-интерфейсы - пока сохраняем собственный внутренний CA.

Причина прозаическая: Let's Encrypt выдаёт сертификаты только для доменов, доступных из интернета. Валидация идёт через HTTP или DNS, и сервер Let's Encrypt должен иметь возможность дотянуться до вашего домена. Внутренний monitoring.corp.internal - не дотянется. Значит, для таких хостов либо внутренний CA с импортом корневого сертификата на рабочие машины, либо самоподписанные с исключениями в браузерах. Мы пошли путём внутреннего CA - это отдельная история.

Ещё один момент: Let's Encrypt выдаёт только DV-сертификаты (Domain Validation). OV (Organization Validation) и EV (Extended Validation) с зелёной строкой - вне зоны доступности. Для клиентов, которым нужен EV по требованию регулятора или корпоративной политики, платные CA никуда не делись.

Что получилось

По итогу закрытой беты: certbot работает, ACME-протокол работает, автоматическое обновление через cron работает. Для нескольких проектов в managed-обслуживании уже переведены публичные домены на Let's Encrypt - никаких платных сертификатов, никакой ручной работы, ssllabs.com доволен.

Публичная бета, по словам команды Let's Encrypt, должна открыться до конца года. Тогда это станет доступно без очереди и приглашений. Пока - работаем с тем что есть, и то что есть - уже очень хорошо.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.