certbot: проверка владения доменом не проходит
Проверка владения доменом по способу http-01 требует, чтобы запрос к пути с проверкой доходил до certbot. Сбой почти всегда означает одно из трёх: порт занят, каталог проверки не тот, или веб-сервер перехватывает запрос редиректом на HTTPS.
Что это значит
Самая коварная причина — редирект. Если блок на 80-м порту целиком уводит запросы на HTTPS, проверка тоже уходит туда и не доходит до файла. Поэтому путь проверки объявляют выше редиректа.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Запрос проверки перехватывается редиректом на HTTPS
Правило «весь http на https» действует и на путь проверки. Certbot кладёт файл, а запрос до него не доходит.
-
Порт 80 занят или закрыт
Способ проверки standalone поднимает свой сервер на 80-м порту и не может этого сделать при работающем веб-сервере. Плюс порт может быть закрыт брандмауэром.
-
Указан не тот каталог проверки
Способ webroot кладёт файл в указанный каталог, а веб-сервер отдаёт его из другого. Пути должны совпадать.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Полный прогон обновления без расхода лимитов выдачи.
sudo certbot renew --dry-runДоходит ли запрос проверки: ответ 404 нормален, 301 — проблема.
curl -sI http://ваш-домен/.well-known/acme-challenge/testСроки действия сертификатов: главный показатель.
sudo certbot certificatesРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Правило «весь http на https» действует и на путь проверки. Certbot кладёт файл, а запрос до него не доходит.
- Как проверить
-
Проверьте, что путь отдаётся по обычному http.
curl -sI http://ваш-домен/.well-known/acme-challenge/test | head -3
- Как исправить
-
Объявите путь проверки выше редиректа в конфигурации веб-сервера.
# в блоке на 80 порту, выше редиректа: # location ^~ /.well-known/acme-challenge/ { root /var/www/acme; }
- Почему происходит
- Способ проверки standalone поднимает свой сервер на 80-м порту и не может этого сделать при работающем веб-сервере. Плюс порт может быть закрыт брандмауэром.
- Как проверить
-
Посмотрите владельца порта и доступность извне.
sudo ss -tlnp | grep ":80\s" curl -sI --max-time 5 http://ваш-домен/ | head -2
- Как исправить
-
Используйте способ через каталог в корне сайта (webroot) вместо standalone: он работает при включённом веб-сервере.
sudo certbot certonly --webroot -w /var/www/acme -d ваш-домен --dry-run
- Почему происходит
- Способ webroot кладёт файл в указанный каталог, а веб-сервер отдаёт его из другого. Пути должны совпадать.
- Как проверить
-
Сравните каталог certbot и корень, из которого отдаётся путь проверки.
sudo grep -r "webroot" /etc/letsencrypt/renewal/ 2>/dev/null | head sudo nginx -T 2>/dev/null | grep -A2 "acme-challenge"
- Как исправить
- Приведите пути к одному значению в настройках обновления и в конфигурации веб-сервера.
Пример вывода
Запрос проверки уводится редиректом на HTTPS. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
certbot[4500]: Challenge failed for domain example.org
certbot[4500]: http-01 challenge for example.org
certbot[4500]: Detail: <адрес>: Invalid response from http://example.org/.well-known/acme-challenge/xVbC...: 301
Связанные ошибки
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Таймер срабатывает, но задача падает незаметно Таймер работает исправно, а задача каждый раз завершается ошибкой, и об этом никто не узнаёт. Как настроить оповещение через OnFailure.
- nginx: [emerg] open() failed при чтении конфигурации nginx не может открыть файл конфигурации, включённый через include, или файл сертификата. Разбор путей и прав.
- nginx: ошибки сертификата при запуске (SSL_CTX_use_PrivateKey) nginx не запускается из-за сертификата: не совпадает ключ, неполная цепочка, файл повреждён, нет прав на чтение ключа.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
Где встречается чаще всего
Источники
- Документация certbot: способы проверки
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено редиректом всего http на https без исключения для пути проверки.