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]
- Клиент создаёт учётную запись — пару ключей, которой подписывает все запросы к серверу ACME.
- Клиент оформляет заказ на сертификат для одного или нескольких имён.
- Для каждого имени сервер выдаёт проверку (challenge), и клиент её выполняет.
- Сервер проверяет выполнение со своей стороны (с нескольких точек в интернете).
- Клиент отправляет запрос на подпись сертификата (CSR) и получает цепочку сертификатов.
- Примерно за треть срока до окончания клиент повторяет процедуру автоматически.
Типы проверок
| Проверка | Как подтверждается владение | Особенности |
|---|---|---|
| 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.