Let's Encrypt и ACME

Материал из llmdocs — справочник разработчика
Let's Encrypt и ACME
Типнекоммерческий центр сертификации
ОператорInternet Security Research Group (ISRG)
Запускпервый сертификат — сентябрь 2015, публичная бета — декабрь 2015
ПротоколACME (RFC 8555, март 2019)
Срок действия сертификата90 дней
Типы проверокHTTP-01, DNS-01, TLS-ALPN-01
Типы сертификатовDV, включая wildcard (через DNS-01)
КлиентыCertbot, acme.sh, lego, Caddy, cert-manager

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

История

Проект основала некоммерческая организация Internet Security Research Group (ISRG) при участии Mozilla, Electronic Frontier Foundation, Мичиганского университета и других. Первый сертификат был выпущен в сентябре 2015 года, публичная бета открылась в декабре 2015-го, а в апреле 2016 года сервис вышел из беты. Протокол ACME, созданный для Let's Encrypt, был стандартизирован IETF как RFC 8555 в марте 2019 года.[2] В 2018 году со второй версией протокола появились wildcard-сертификаты (*.example.com).

Let's Encrypt — один из крупнейших центров сертификации в мире: он обслуживает сотни миллионов сайтов.[6] Протокол ACME поддерживают и другие центры сертификации — ZeroSSL, Google Trust Services, Buypass, — поэтому клиент можно переключить на другого поставщика одной настройкой.

Как работает ACME

Let's Encrypt выдаёт сертификаты с проверкой домена (DV): он удостоверяет только, что заявитель контролирует доменное имя (подробнее — Сертификат X.509 и центры сертификации).[1]

  1. Клиент создаёт учётную запись — пару ключей, которой подписывает все запросы к серверу ACME.
  2. Клиент оформляет заказ на сертификат для одного или нескольких имён.
  3. Для каждого имени сервер выдаёт проверку (challenge), и клиент её выполняет.
  4. Сервер проверяет выполнение со своей стороны (с нескольких точек в интернете).
  5. Клиент отправляет запрос на подпись сертификата (CSR) и получает цепочку сертификатов.
  6. Примерно за треть срока до окончания клиент повторяет процедуру автоматически.

Типы проверок

Проверка Как подтверждается владение Особенности
HTTP-01 файл по адресу http://<домен>/.well-known/acme-challenge/<токен> нужен доступ к порту 80; wildcard не поддерживает
DNS-01 TXT-запись _acme-challenge.<домен> единственный способ для wildcard; работает для серверов, закрытых из интернета; нужен API DNS-провайдера
TLS-ALPN-01 особый сертификат при TLS-подключении к порту 443 для прокси и балансировщиков, которым не нужен порт 80

Подробности — в документации Let's Encrypt.[3] Для DNS-01 нужно создать TXT-запись, поэтому клиенты поддерживают API десятков DNS-провайдеров.

Короткий срок жизни

Сертификаты Let's Encrypt действуют 90 дней, а не год или два, как было принято раньше. Это сделано сознательно: короткий срок уменьшает ущерб при утечке закрытого ключа и вынуждает автоматизировать продление — ручное продление раз в три месяца неудобно, поэтому его просто не делают вручную. Индустрия идёт дальше: Let's Encrypt предлагает и сертификаты на несколько дней, а требования браузеров к максимальному сроку действия сертификатов постепенно ужесточаются.

Клиенты

# Certbot (EFF): получить сертификат и настроить nginx
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot renew --dry-run          # проверить автопродление

# acme.sh: wildcard через DNS-API провайдера
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'
  • Certbot — эталонный клиент от EFF, умеет сам настраивать nginx и Apache и ставит таймер продления (см. cron и таймеры systemd).[5]
  • acme.sh — клиент на чистом shell без зависимостей; lego — на Go.
  • Caddy и Traefik получают и продлевают сертификаты сами, без отдельного клиента: достаточно указать домен в конфигурации.
  • cert-manager выпускает сертификаты для Kubernetes и хранит их в объектах Secret.[7]

Ограничения

  • Только проверка домена (DV): нет сертификатов с проверкой организации (OV/EV) и сертификатов для IP-адресов в классическом виде.
  • Лимиты на частоту выпуска: например, не больше 50 сертификатов на зарегистрированный домен в неделю и ограниченное число неудачных проверок. Для отладки используют тестовый сервер (staging) с мягкими лимитами.[4]
  • Перед выпуском центр сертификации проверяет DNS-запись CAA: если владелец домена разрешил выпуск только другому центру, Let's Encrypt откажет.
  • Все выпущенные сертификаты публикуются в журналах прозрачности сертификатов (Certificate Transparency) — по ним можно узнать имена поддоменов. Для внутренних имён это стоит учитывать или использовать wildcard.

См. также

Источники

  1. Let's Encrypt — How It Works
  2. RFC 8555 — Automatic Certificate Management Environment (ACME)
  3. Let's Encrypt — Challenge Types
  4. Let's Encrypt — Rate Limits
  5. Certbot — EFF
  6. Let's Encrypt — Statistics
  7. cert-manager — documentation