CAA
CAA (Certification Authority Authorization, RFC 8659) — DNS-запись, в которой владелец домена указывает какие Certificate Authority вообще имеют право выпускать серты для этого домена. Все CA обязаны проверять эту запись перед выпуском (это условие CA/Browser Forum baseline).
Формат
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 issue "sectigo.com"
example.com. IN CAA 0 issuewild ";"
example.com. IN CAA 0 iodef "mailto:security@example.com"
Поля:
- flags —
0или128(critical: если CA не понимает тег, не выпускать). - tag —
issue(обычные серты) ·issuewild(wildcard *.example.com) ·iodef(куда слать нотификации о нарушениях). - value — идентификатор CA (обычно доменное имя), или
";"= никому нельзя.
Как это работает
- Ты запросил серт у Let's Encrypt.
- Их CA перед выпуском делает DNS-запрос
CAA example.com. - Если ответ содержит
issue "letsencrypt.org"— выпускают. - Если только
issue "sectigo.com"— отказывают. - Если записи вообще нет — выпускают (CAA отсутствует = ограничений нет).
Проверка CAA
dig CAA example.com +short
# 0 issue "letsencrypt.org"
# онлайн:
# https://sslmate.com/caa/
Полезные значения
| Задача | Запись |
|---|---|
| Разрешить только Let's Encrypt | 0 issue "letsencrypt.org" |
| Запретить всех | 0 issue ";" |
| Запретить wildcard | 0 issuewild ";" |
| Уведомления на email | 0 iodef "mailto:sec@example.com" |
| Определённый аккаунт LE | 0 issue "letsencrypt.org;accounturi=..." |
Плюсы
- Защита от «случайного» CA, который выпустит серт по слабой проверке.
- Работает всегда (CA обязаны проверять).
- Не требует DNSSEC (в отличие от DANE).
- Настраивается за 2 минуты, лежит в DNS.
Минусы
- Не защищает от скомпрометированного CA — он может проигнорировать CAA и выпустить всё равно (проверяется через CT-логи).
- Не защищает от MITM на уровне DNS — если DNS подменили, поменяли и CAA (тут помогает DNSSEC).