ACME
ACME
ACME (Automatic Certificate Management Environment) — протокол, по которому
сервер сам, без участия человека, доказывает удостоверяющему центру, что
владеет доменом, и получает TLS-сертификат. Именно на нём построен Let's
Encrypt и вся современная «бесплатная HTTPS-инфраструктура» интернета.
История
- 2012 год, США. В университете Мичигана и в Mozilla начинают обсуждать
идею: сделать выдачу TLS-сертификатов автоматической. Раньше это было
ручной процедурой на 15–30 минут, стоила от 8 до 200 долларов в год, и
подавляющее большинство сайтов ходили по HTTP просто потому, что «лень
и дорого». - Ноябрь 2014. Основана некоммерческая организация ISRG (Internet
Security Research Group). Основные спонсоры — Mozilla, Cisco, Akamai,
EFF (Electronic Frontier Foundation). Задача — запустить бесплатный
удостоверяющий центр Let's Encrypt. - Апрель 2015. Первый публичный черновик протокола ACME.
- Сентябрь 2015. Let's Encrypt получает кросс-подпись от IdenTrust и
становится доверенным CA (Certificate Authority) для всех основных
браузеров. - Декабрь 2015. Публичная бета Let's Encrypt. Любой человек, у которого
есть домен, может получить сертификат бесплатно за пару минут. - Апрель 2016. Let's Encrypt выходит из беты. За первый год —
~3.8 миллиона активных сертификатов. - Март 2018. ACMEv2 (черновик 12). Добавлены wildcard-сертификаты
(*.example.com) через DNS-валидацию. - Март 2019. ACME стандартизирован как RFC 8555. С этого момента
это не «протокол одного CA», а официальный интернет-стандарт. - К 2026 году ACME поддерживают Let's Encrypt, ZeroSSL, Buypass,
Google Trust Services, Sectigo и почти все крупные удостоверяющие центры.
Через ACME выдаётся большая часть новых TLS-сертификатов в мире.
Что это такое
ACME — это HTTPS-протокол общения двух программ: ACME-клиента (стоит на
твоём сервере) и ACME-сервера (стоит у удостоверяющего центра, например
Let's Encrypt). Клиент говорит: «Хочу сертификат для домена blog.example.ru».
Сервер отвечает: «Докажи, что ты — владелец этого домена. Вот задание».
Клиент выполняет задание, сервер проверяет, всё сходится — выдаёт сертификат.
Ключевая идея — машинная верификация владения доменом (Domain Control
Validation, DCV). Никаких паспортов, юридических лиц, звонков в офис.
Только техническое доказательство: «я контролирую этот домен прямо сейчас».
Из этого следует важное ограничение — ACME умеет выдавать только
сертификаты уровня DV (Domain Validation). То есть браузер увидит
«соединение защищено», но никакой информации об организации в сертификате
не будет. Для сертификатов уровня OV или EV (Extended Validation, с
проверкой юрлица и зелёной строкой в старых браузерах) ACME не подходит —
там нужна ручная проверка документов.
Отличие от старой модели («X vs Y»):
- Ручная выдача vs ACME. Раньше: генерируешь CSR (запрос на сертификат),
идёшь на сайт CA, оплачиваешь, доказываешь владение через письмо на
admin@yourdomain, ждёшь, скачиваешь.crt, руками кладёшь на сервер,
перезапускаешь nginx. Через год — всё то же самое. С ACME: одна команда
раз в жизни, дальше сервер сам обновляется по крону. - EV vs DV. EV говорит «Организация X юридически существует», DV
говорит «Кто-то контролирует этот домен прямо сейчас». Браузеры давно
перестали визуально различать EV и DV — с 2019 года адресная строка
выглядит одинаково.
Аналогии из жизни
1. Пропуск в офисный центр по коду из СМС.
Раньше пропуск делали так: приходишь на ресепшн, показываешь паспорт,
охранник звонит в компанию, тебе печатают бумажный пропуск на месяц.
Через месяц — снова. ACME похож на систему, где ты один раз привязал свой
телефон, и дальше при каждом входе тебе приходит СМС с кодом. Твоё
владение номером — доказательство личности; охраннику ничего проверять
руками не надо.
Где ломается: аналогия плохо работает, когда СИМ-карту крадут — ACME
устроен так, что «доступ к домену» это и есть личность в его картине
мира, никакого «настоящего тебя» за пределами этого нет. Если кто-то
захватил твой домен, он для CA становится тобой. В офисной аналогии
владелец здания всё-таки может выгнать самозванца, у ACME такого
арбитра нет.
2. Регистрация водителя в такси через фото машины.
Представь, что чтобы стать водителем такси, тебе не нужны документы: ты
просто фотографируешь свою машину рядом со специальным QR-кодом, который
диспетчер попросил именно тебя разместить (кто-то другой не мог знать,
где его размещать). Диспетчер видит фото — регистрирует. С ACME так же:
CA просит клиента положить конкретный файл в конкретное место, куда
может дотянуться только владелец домена.
Где ломается: машина — физическая вещь, украсть её сложно. Домен —
запись в базе данных регистратора. Захват аккаунта у регистратора
доменов делает атаку тривиальной. Именно поэтому ACME сам по себе не
решает проблему «а если у меня угонят домен» — тут нужны отдельные
защиты (регистр-локи, DNSSEC, CAA-записи).
3. Автопродление подписки на журнал.
Раньше журналы приходилось выписывать заново каждый год: платил,
получал наклейку с индексом, шёл на почту. Сейчас — списывают с карты
автоматически, доставка не прерывается. ACME превратил TLS-сертификаты
из «раз в год руками» в «раз в 60 дней тихо и автоматически». Ты даже
не знаешь, когда именно это происходит.
Где ломается: у автопродления журнала есть длинная память — если карта
испортилась, у почты остаются старые данные и она может задержать
списание. У сертификатов такой снисходительности нет: если автообновление
не сработало и старый сертификат истёк — сайт мгновенно отдаёт «Ваше
соединение не защищено», трафик обваливается. Мониторинг на срок
действия — обязательный.
Как это работает
Разберём типичный сценарий: сервер хочет получить сертификат для
blog.example.ru.
Шаг 1. Регистрация аккаунта.
Клиент генерирует пару ключей (обычно RSA 2048 или ECDSA P-256). Публичный
ключ отправляет ACME-серверу вместе с email для аварийных уведомлений.
Сервер создаёт учётную запись, привязывает её к публичному ключу. Дальше
все запросы клиента подписываются приватным ключом — так CA понимает,
что запрос идёт от того же аккаунта.
Шаг 2. Newnonce (одноразовый маркер).
Каждый запрос в ACME должен содержать одноразовый nonce, полученный от
сервера. Это защита от replay-атак — злоумышленник не может перехватить
твой подписанный запрос и повторить его. Клиент делает HEAD /new-nonce,
получает заголовок Replay-Nonce, кладёт его в следующий запрос.
Шаг 3. New Order (заказ на сертификат).
Клиент шлёт: «Хочу сертификат на такие-то identifier'ы» (списки доменов).
Сервер отвечает объектом Order с массивом Authorization'ов — по одному
на каждый домен. Authorization содержит массив Challenge'ей.
Шаг 4. Выбор challenge (проверки).
Для каждого домена CA предлагает несколько способов доказать владение.
Клиент выбирает один. Основные три:
- HTTP-01. «Положи файл
/.well-known/acme-challenge/<токен>на
http://blog.example.ru/. Мы придём и прочитаем.» Требует, чтобы порт
80 был открыт и доступен снаружи. Самый популярный. - DNS-01. «Создай TXT-запись
_acme-challenge.blog.example.ruсо
значением <хэш>.» Не требует открытого порта, единственный способ
получить wildcard-сертификат*.example.ru. Требует API у
DNS-провайдера или ручного редактирования зоны. - TLS-ALPN-01. «Ответь на TLS-хендшейке с ALPN=
acme-tls/1
специальным самоподписанным сертификатом, содержащим наш токен.»
Работает через 443-й порт, редко используется, полезен когда 80-й
недоступен, но нельзя трогать содержимое сайта.
Шаг 5. Клиент выполняет challenge.
Например, для HTTP-01 создаёт файл с содержимым <токен>.<хэш публичного
ключа> в .well-known/acme-challenge/. Или обращается к nginx-конфигу
и добавляет специальный location-блок. Именно эту работу выполняли
плагины webroot, standalone, nginx у certbot.
Шаг 6. Клиент дёргает сервер: «Готов, проверяй».
Отправляет запрос на URL challenge'а. Сервер запускает валидатор — идёт
за файлом или DNS-записью с нескольких точек мира (multi-perspective
validation, введено Let's Encrypt в 2020 году как защита от BGP-атак).
Если всё сходится — статус Authorization становится valid.
Шаг 7. Finalize.
Когда все Authorization'ы для Order'а стали valid, клиент генерирует
приватный ключ для будущего сертификата, формирует CSR (Certificate
Signing Request — файл с публичным ключом и списком доменов, подписанный
приватным ключом сертификата) и отправляет его на URL finalize. CA
подписывает CSR своим intermediate-ключом, получается сертификат.
Шаг 8. Скачивание.
Клиент периодически опрашивает URL Order'а. Когда статус — valid,
скачивает готовый сертификат вместе с промежуточными сертификатами
(certificate chain). Кладёт куда нужно (обычно /etc/letsencrypt/live/<домен>/),
перезагружает веб-сервер.
Шаг 9. Через ~60 дней — повторить.
Сертификаты Let's Encrypt действуют 90 дней. Рекомендуется обновлять на
60-м дне — остаётся месяц запаса на случай проблем. Клиент запускается
по крону (или systemd-таймеру), проверяет срок действия, если пора —
повторяет шаги 3–8. Аккаунт уже существует, ключи уже есть — обычно
занимает секунды.
Клиент ACME-сервер (Let's Encrypt)
| |
|-- POST /new-account (публичный ключ) ------>|
|<---------------------- 201 (аккаунт создан) |
| |
|-- POST /new-order (домены) ---------------->|
|<---- 201 (Order + список Authorization URL) |
| |
|-- GET /authz/... --------------------------->|
|<--------------------- challenges (HTTP/DNS) |
| |
| ... клиент выполняет HTTP-01 challenge ... |
| |
|-- POST /challenge/... (готов) ------------->|
| (валидатор идёт за файлом)
|<------------------------- valid / invalid |
| |
|-- POST /finalize (CSR) -------------------->|
|<------------------------- Order: processing |
|-- GET /order/... --------------------------->|
|<------------- Order: valid + certificate URL|
|-- GET /cert/... ---------------------------->|
|<--------------------- PEM: cert + chain |
Где встречается в обычной жизни
- Замочек в браузере на любом сайте. Больше 95% доменов сегодня
ходят по HTTPS, и большая часть этих сертификатов выпущена через
ACME. Ты видишь его каждую минуту, не подозревая. - Реклама «бесплатный SSL при регистрации домена» у хостинг-провайдеров.
Внутри — почти всегда ACME-клиент с Let's Encrypt, автоматически
запускающийся при добавлении домена. - Yandex.Cloud, Timeweb, Reg.ru и любой российский хостинг в один
клик включают HTTPS — это ACME. - Wi-Fi роутеры Ubiquiti и Mikrotik умеют сами получать сертификаты
для веб-интерфейса, чтобы админ не видел «незащищённое соединение».
Внутри — ACME. - Умные колонки, камеры, принтеры с веб-панелью управления. Многие
из них теперь тоже выпускают себе сертификаты через ACME — часто
через субдомены производителя (например<серийник>.devices.company.com).
Где встречается в IT и бизнесе
- Массовая выдача сертификатов SaaS-провайдерами. Если ты дал своему
клиенту кастомный домен (например,shop.<имя-клиента>.ruна твоей
платформе) — под капотом ACME выпустит сертификат за минуту. - Автоматизация в Kubernetes через cert-manager: описываешь YAML-
манифест с доменом, cert-manager сам договаривается с Let's Encrypt,
обновляет сертификаты, кладёт их в Kubernetes Secret. - CDN и load-balancer'ы (Cloudflare, AWS ALB, DigitalOcean Load
Balancer) — везде под кнопкой «включить HTTPS» стоит ACME. - Отдельный класс задач — mTLS (mutual TLS) во внутренних микросервисах,
где ACME используется приватным CA внутри компании для выдачи
клиентских сертификатов. - Wildcard-сертификаты для мультитенантных SaaS: одна DNS-01 проверка,
один сертификат*.customer.example.com, обслуживает тысячи
поддоменов.
Кто пользуется
- Let's Encrypt — крупнейший ACME-сервер. К 2026 году выдал более
4 миллиардов сертификатов, обслуживает больше 550 миллионов активных
доменов. Управляется ISRG. Полностью бесплатен, финансируется
спонсорами (Mozilla, EFF, Cisco, Meta, Google и другими). - Cloudflare внутри себя — крупнейший потребитель, автоматически
выпускает сертификаты для миллионов доменов клиентов. - AWS Certificate Manager, Google Certificate Manager, Azure Key Vault
— облачные аналоги. Внутри — что-то очень похожее, но часто с
проприетарным протоколом плюс поддержка ACME для клиентов извне. - ZeroSSL — коммерческий CA, поддерживает ACME. Бесплатен до 90
сертификатов в год, дальше — по подписке. Часто выбирают те, кому
нужны 1-year-сертификаты (Let's Encrypt даёт только 90 дней). - Buypass Go SSL (Норвегия) — ещё один бесплатный ACME-CA, часто
используется как второй провайдер для fallback. - hosting.reg.ru, timeweb.ru, beget.com — российские хостинги, все
под капотом используют Let's Encrypt через ACME.
Масштаб: Let's Encrypt отдаёт около 8 миллионов сертификатов в день. Их
инфраструктура — примерно 10 датацентров, шифруется чуть ли не половина
всего интернета.
Альтернативы и конкуренты
- Ручная покупка у DigiCert / Sectigo / GlobalSign.
Плюсы: OV/EV-сертификаты с проверкой юрлица, страховка на миллионы
долларов, поддержка старых устройств. Минусы: 200–2000 долларов в
год, ручной процесс, нужны документы. - Самоподписанные сертификаты.
Плюсы: бесплатно, полный контроль, работают в закрытых системах.
Минусы: браузер всегда ругается «не доверяю», нужно вручную
устанавливать корневой сертификат на все устройства-клиенты. Годится
для внутренних API, не для публичных сайтов. - Проприетарные API облачных CA (AWS ACM).
Плюсы: одна кнопка, интеграция с балансировщиком облака, никаких
ключей на руках. Минусы: замкнутая экосистема, нельзя вынести
сертификат наружу, привязка к вендору. - Cloudflare Origin CA.
Плюсы: сертификат на 15 лет, только для трафика между Cloudflare и
твоим сервером. Минусы: работает только если стоишь за Cloudflare,
браузер такому сертификату не поверит без Cloudflare-прокси.
Когда НЕ стоит использовать
- Внутренняя изолированная сеть без доступа наружу. ACME требует,
чтобы CA мог достучаться либо до 80-го порта, либо до публичного DNS.
В закрытом контуре проще поднять свой внутренний CA (например,
step-ca от Smallstep, или Vault PKI) и им подписывать всё внутри. - Нужен OV/EV сертификат (юридические лица, финансовые сервисы, где
сама организация в сертификате важна). ACME — только DV. - Ты не можешь автоматизировать обновление. Например, устройство
без интернет-соединения между обновлениями, старый железный
роутер без крон-агента. Сертификат на 90 дней и невозможность
автообновления — рецепт катастрофы. Тут выгоднее купить обычный
1-year или 3-year сертификат.
Связанные понятия
- CSR (Certificate Signing Request) — файл с публичным ключом и
списком доменов, подписанный приватным ключом. Именно его CA
подписывает своим ключом, чтобы получился сертификат. - CA (Certificate Authority) — удостоверяющий центр. Организация,
чьи корневые сертификаты вшиты в браузеры и ОС. - DV / OV / EV — три уровня проверки при выдаче сертификата.
Domain, Organization, Extended Validation. ACME умеет только DV. - CAA-запись (Certificate Authority Authorization) — специальная
DNS-запись, которая говорит «сертификаты для этого домена может
выдавать только вот такой CA». Защита от того, что чужой CA
выпишет сертификат на твой домен. - SNI (Server Name Indication) — расширение TLS, которое позволяет
разным сайтам с разными сертификатами жить на одном IP-адресе.
Без SNI ACME был бы гораздо сложнее. - Certificate Transparency (CT) — публичные логи всех выпущенных
сертификатов. Любой владелец домена может проверить, что для него
никто чужой не выписал сертификат. - OCSP / CRL — механизмы отзыва сертификатов, когда приватный
ключ утёк.
Литература и источники
- RFC 8555 «Automatic Certificate Management Environment» — основная
спецификация. Читается за 3–4 часа, очень подробная. Искать на
datatracker.ietf.orgпо «RFC 8555». - Официальная документация Let's Encrypt:
letsencrypt.org/docs/.
Разделы «How It Works» и «Challenge Types» — обязательное чтение для
начала. - Certbot User Guide:
eff.org/certbot. Практика: как ставить,
какие плагины бывают, как решать типичные проблемы. - Википедия ru «Let's Encrypt» — короткий, но точный обзор истории.
- Aaron Gable «Multi-Perspective Issuance Corroboration» (2020) —
статья в блоге Let's Encrypt про защиту от BGP-атак через
валидацию из нескольких дата-центров. Искать в Google: «letsencrypt
multi-perspective validation». - «Bulletproof SSL and TLS» — Ivan Ristić, 2014, en. Классика по TLS
в целом; глава про ACME короткая, но всё остальное про
сертификаты — образец.
Где встретилось у меня
Вчера половина рабочего дня ушла на восстановление TLS-сертификатов на
нескольких доменах, где после переезда сломалась цепочка renew: certbot
не мог пройти HTTP-01 challenge из-за того, что nginx-конфиг раньше
отдавал 301 на HTTPS вместо того, чтобы обслуживать
/.well-known/acme-challenge/ по HTTP. Ползали по webroot-плагину,
чинили location-блоки, разбирали, почему LE-валидатор ходит на
Fornex-адрес, а не на реальный сервер. Пока это чинил — стало
очевидно, что понимание ACME на уровне «протокол между клиентом и CA»
экономит часы: сразу видно, где в этой цепочке лежит поломка.
Краткое резюме
- ACME — стандартизированный (RFC 8555) протокол, по которому
сервер сам получает TLS-сертификат, доказывая владение доменом
машинным способом. - Родился в 2015 году в Let's Encrypt, сегодня — почти весь новый
HTTPS в интернете. - Три основных проверки: HTTP-01 (файл на порту 80), DNS-01
(TXT-запись, единственный способ для wildcard), TLS-ALPN-01
(через порт 443). - Сертификаты Let's Encrypt живут 90 дней — обновляются
автоматически на 60-м, без автообновления сайт умрёт через квартал. - Умеет только DV (проверку владения доменом). Для OV/EV нужны
старые ручные CA. Автоматизация — плюс, но требует, чтобы у CA
была возможность достучаться до твоего сервера или DNS.