Нещодавно під час автоматичного продовження SSL-сертифіката Cloudflare надіслав мені лист із проханням додати DNS-запис _acme-challenge.
На перший погляд ситуація виглядала дивно: Cloudflare вже мав Universal SSL-сертифікат для домену, причому сертифікат покривав як основний домен, так і wildcard:
example.com
*.example.com
Але для чергового продовження Cloudflare попросив вручну додати TXT-запис.
Розберімося, що це таке і навіщо він потрібен. Але спочатку я перевірив чи це був справді емейл від Cloudflare, а не якийсь хитрий спосіб вкрасти домен. Після перевірки - пішов розбиратися з цим _acme-challenge.
ACME — протокол, за допомогою якого автоматизовано отримання та продовження SSL/TLS-сертифікатів. Його, зокрема, використовує Let's Encrypt, а також інші центри сертифікації.
Під час перевірки потрібно довести, що людина або сервіс, який запитує сертифікат, справді контролює домен.
Один зі способів зробити це — DNS-01 challenge.
У цьому випадку створюється TXT-запис приблизно такого вигляду:
_acme-challenge.example.com
із певним значенням:
y_DgjAHPWuxNmcyKLHhljRL-5e734ndz99rk_DLeSrF
Значення генерується автоматично і є частиною конкретної перевірки.
Як відбувається перевірка
У спрощеному вигляді процес виглядає так:
Cloudflare / ACME
↓
генерує challenge
↓
потрібен TXT-запис
↓
_acme-challenge.example.com
↓
DNS
↓
перевірка центром сертифікації
↓
сертифікат продовжено
Центр сертифікації перевіряє DNS і шукає необхідний TXT-запис.
Якщо значення збігається з очікуваним, контроль над доменом підтверджено.
Чому Cloudflare попросив мене додати його вручну
У моєму випадку Cloudflare надіслав лист із повідомленням, що не зміг автоматично виконати перевірку.
Серед можливих причин Cloudflare назвав:
використання часткового CNAME DNS setup;
наявність wildcard-сертифіката;
домен більше не резолвиться через мережу Cloudflare;
неможливість Cloudflare самостійно додати необхідний validation-запис.
Особливо важливим у моєму випадку був wildcard-сертифікат.
У налаштуваннях Edge Certificates було видно сертифікат для:
example.com
*.example.com
Тобто Cloudflare використовував сертифікат, який покриває не тільки сам домен, а й усі його піддомени.
Для wildcard-сертифікатів використовується DNS-based validation.
Який запис потрібно додати
Cloudflare надіслав конкретний TXT-запис, який потрібно було додати до DNS.
Виглядає він приблизно так:
Type: TXT
Name: _acme-challenge
Content: <унікальне значення від Cloudflare>
У результаті повне DNS-ім'я буде:
_acme-challenge.example.com
Важливо: не потрібно створювати для цього окремий A-запис або CNAME, якщо Cloudflare прямо просить TXT.
Також не потрібно вигадувати значення TXT — його потрібно використовувати саме те, яке надав Cloudflare.
Чому _acme-challenge починається з _
Це службове DNS-ім'я.
Підкреслення (_) часто використовується для спеціальних DNS-механізмів, які не призначені для звичайного доступу через браузер.
Тому:
_acme-challenge.example.com
не означає, що на сайті з'явився новий піддомен.
Це службовий запис, який використовується для ACME validation.
Чи потрібно залишати TXT-запис назавжди?
Не обов'язково.
Якщо запис створений для конкретної одноразової перевірки, після її завершення він може більше не знадобитися.
Але тут потрібно бути обережним.
Якщо у вас налаштоване автоматичне продовження сертифікатів і використовується DNS-01, система може самостійно створювати та видаляти такі записи.
Тому не варто просто видаляти всі _acme-challenge записи, не розібравшись, для чого вони використовуються.
Чому таких записів може бути декілька
У DNS можна побачити кілька TXT-записів для одного _acme-challenge.
Кілька validation-записів можуть існувати, якщо одночасно проходять різні перевірки або кілька сертифікатів використовують один домен.
Тому видаляти старі записи навмання не варто.
А що з Universal SSL у Cloudflare?
Це також може збивати з пантелику.
У Cloudflare в розділі SSL/TLS → Edge Certificates можна побачити кілька сертифікатів одночасно.
Наприклад:
Universal SSL → Managed
Backup → Managed
При цьому один сертифікат може мати дату завершення дії пізніше, ніж інший.
Тому лист із проханням пройти validation не означає автоматично, що поточний HTTPS уже перестав працювати.
Cloudflare може готувати або продовжувати інший сертифікат у межах своєї системи керування.
Що буде, якщо не додати _acme-challenge
Якщо Cloudflare не зможе підтвердити контроль над доменом і не зможе продовжити необхідний сертифікат до завершення його дії, сертифікат може бути видалений з Cloudflare Edge.
У результаті користувачі можуть отримати помилку TLS/SSL під час підключення до сайту.
Тому такі листи від Cloudflare краще не ігнорувати.
Що я зробив у своєму випадку
Cloudflare надіслав мені TXT-запис для _acme-challenge.
Я додав його до DNS-records Cloudflare. Бо Namecheap (реєстратор домену) посилалається на Cloudflare. Тож справа у конфігах Cloudflare.
Aле майте наувазі, що навіть якщо сайт працює через Cloudflare, це не завжди означає, що Cloudflare керує авторитетними DNS-записами.
Якщо DNS знаходиться в іншого провайдера, Cloudflare не завжди може самостійно створити необхідний _acme-challenge (або як у моєму випадку - сам у себе не міг створити).
Його ідея проста: один раз налаштувати делегування _acme-challenge, після чого Cloudflare зможе автоматично розміщувати validation-записи під час наступних продовжень сертифіката.
Інший варіант — використовувати повну DNS-конфігурацію Cloudflare, коли authoritative nameservers домену вказують на Cloudflare.
У такому випадку Cloudflare має повний контроль над DNS і може автоматично створювати необхідні validation-записи. Ну й підсумуємо:
_acme-challenge — це не помилка і не «лівий» піддомен.
Це службовий DNS-запис, який використовується для ACME DNS-01 validation — підтвердження того, що ви контролюєте домен.
Якщо Cloudflare просить додати:
_acme-challenge
як TXT-запис, це означає, що йому потрібно пройти DNS-перевірку для видачі або продовження SSL/TLS-сертифіката.
У моєму випадку це проявилося під час продовження Cloudflare Universal SSL, причому сертифікат включав wildcard *.<домен>. Саме тому питання DNS-валідації стало особливо актуальним.