1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 5 из 5

Конспект: выпуск и продление

выжимка - её можно унести в заметки

Как сертификат выпускается сам и что должно быть в конфиге, чтобы продление не ломалось.

Как проходит проверка http-01

1. клиент просит сертификат для shop.local
2. Let's Encrypt: «положи файл по адресу
   http://shop.local/.well-known/acme-challenge/<token>»
3. клиент кладёт файл
4. Let's Encrypt делает HTTP-запрос
5. совпало → сертификат выписан

Исключение в редиректе: явный location на 80-м порту

server {
    listen 80;
    server_name shop.local www.shop.local;

    location /.well-known/acme-challenge/ {   # рядом с location /
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}
$  команда
certbot certonly --webroot -w /var/www/certbot -d shop.local -d www.shop.local

shop.local - имя стенда: Let's Encrypt на него не выдаст. В -d ставят свой публичный домен с записью A/AAAA на сервер и открытым 80-м портом; без домена практикуются на локальном центре ACME (Pebble).

Два пути

Путь Особенность
certbot (webroot / --nginx) классика, работает везде; продление таймером systemd
нативный модуль nginx-module-acme (1.29.0+) выпуск прямо в nginx, без внешнего клиента
dns-01 нужен для wildcard и для серверов без входящего 80 порта

Ловушки джокера

  • return 301 на уровне server - блок челленджа становится мёртвым кодом, и проверка зависит от https-сервера: отдаёт ли он этот путь. Не отдаёт - продление сломается, а узнают об этом через 90 дней.
  • Продление без reload. Новый файл лежит на диске, nginx держит в памяти старый: --deploy-hook "systemctl reload nginx".
  • Лимиты Let's Encrypt (сертификатов на домен в неделю) выбираются быстро, если гонять выпуск в цикле при отладке. Для тестов есть staging-окружение.

Что ловит проверка конфига у модуля ACME

что убрали nginx -t когда всплывёт
resolver [emerg] acme_issuer: "resolver" is not configured сразу
state_path successful ничего: с модуля 0.2.0 умолчание acme_<issuer> (замер на 0.4.1 - /var/cache/nginx/acme_le); явный путь нужен ради прав, переносимости и бэкапа
ssl_certificate_cache successful под нагрузкой
маска в начале имени, *.shop.local successful при выпуске: имена нужны явные
маска в конце или середине, одна регулярка [emerg] (модуль 0.4.1) сразу

То есть nginx -t у модуля ловит далеко не всё: из четырёх упущений он ловит одно, два доезжают до работы, а четвёртое - пропущенный state_path - ошибкой не является.

Замер про certbot

return 301 на уровне server уводит челлендж в редирект (301), тот же редирект внутри location / отдаёт файл (200). Let's Encrypt за редиректом пойдёт и сертификат на https проверять не станет, так что схема с редиректом работает, пока блок на 443 сам отдаёт путь челленджа, - и не работает вовсе при первом выпуске, когда на 443 ещё никого нет.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.