Сертификат Let's Encrypt не выпускается: ошибки и решения
Бесплатный SSL-сертификат от Let's Encrypt обычно выпускается в один клик — в панели хостинга или командой certbot. Но иногда вместо сертификата появляется ошибка, а сайт продолжает открываться с предупреждением «Подключение не защищено».
Если в тексте ошибки есть конкретная причина, ниже найдется конкретное решение. Если же панель пишет только «Verification failed» без подробностей или ошибка то появляется, то нет, поможет чек-лист в конце статьи.
Как Let's Encrypt проверяет домен
Прежде чем выдать сертификат, Let's Encrypt проверяет, что вы действительно управляете доменом. Чаще всего для этого используется HTTP-проверка: сервер создает на сайте временный файл по адресу /.well-known/acme-challenge/, а Let's Encrypt пытается открыть его по протоколу HTTP через порт 80.
Если файл открылся и его содержимое совпало — сертификат выпускается. Если нет — появляется ошибка. Поэтому почти все проблемы сводятся к одному: по какой-то причине Let's Encrypt не может получить этот файл.
💡 Важно: Let's Encrypt проверяет каждый домен из сертификата отдельно. Если сертификат выпускается для example.com и www.example.com, оба адреса должны вести на ваш сервер.
DNS problem: NXDOMAIN
DNS problem: NXDOMAIN looking up A for example.com - check that a DNS record exists for this domain
Причина: у домена нет DNS-записи A (или AAAA), то есть Let's Encrypt не знает, на какой сервер идти. Так бывает, если домен только что зарегистрирован, записи еще не созданы или в имени поддомена есть опечатка.
Решение: в панели регистратора или DNS-хостинга создайте запись A с IP-адресом вашего сервера и подождите, пока она обновится. Проверить запись можно командой dig или через сервис dns.google:
dig +short example.com A
Invalid response: 404 или 403
Invalid response from http://example.com/.well-known/acme-challenge/...: 404
Причина: Let's Encrypt дошел до сервера, но не нашел проверочный файл. Чаще всего виноваты правила в .htaccess, которые перенаправляют все запросы в index.php или в другую папку, неправильная корневая папка сайта или запрет доступа к скрытым папкам, которые начинаются с точки. Код 403 означает, что файл есть, но доступ к нему запрещен.
Решение: исключите папку проверки из перенаправлений. В Apache добавьте правило в начало .htaccess, сразу после RewriteEngine On:
RewriteRule ^\.well-known/acme-challenge/ - [L]
В Nginx — отдельный блок location в конфигурации сайта:
location ^~ /.well-known/acme-challenge/ {
root /var/www/example.com;
}
Если в ошибке указан другой IP-адрес или в ответе видна чужая страница, значит, домен ведет не на ваш сервер. Тогда смотрите раздел с чек-листом.
Timeout during connect
Timeout during connect (likely firewall problem)
Причина: Let's Encrypt не смог подключиться к серверу за отведенное время. Чаще всего порт 80 закрыт файрволом сервера или хостинга. Иногда хостинг блокирует запросы из других стран, а Let's Encrypt проверяет домен сразу с нескольких серверов в разных частях мира.
Решение: откройте порт 80 в файрволе сервера и в панели хостинга, если там есть свой. Для ufw в Ubuntu это одна команда:
sudo ufw allow 80/tcp
Если у сервера включена блокировка по странам, отключите ее хотя бы для порта 80.
⚠️ Важно: порт 80 нельзя закрывать даже после выпуска сертификата. Он понадобится для автоматического продления раз в несколько месяцев, а для посетителей достаточно настроить с него редирект на HTTPS.
Connection refused
Connection refused
Причина: сервер доступен, но на порту 80 ничего не работает: веб-сервер остановлен или настроен только на HTTPS.
Решение: проверьте, что веб-сервер запущен и слушает порт 80. Если сайт настроен только на 443 порт, добавьте для него HTTP-версию с редиректом на HTTPS, но так, чтобы папка /.well-known/acme-challenge/ оставалась доступной.
CAA record prevents issuance
CAA record for example.com prevents issuance
Причина: у домена есть DNS-запись CAA, которая разрешает выпускать сертификаты только определенным центрам сертификации, и Let's Encrypt в этом списке нет.
Решение: удалите запись CAA или добавьте в нее Let's Encrypt:
example.com. CAA 0 issue "letsencrypt.org"
Too many failed authorizations
too many failed authorizations recently
Причина: у Let's Encrypt есть лимиты. Например, не больше 5 неудачных проверок одного домена в час. Если нажимать кнопку выпуска снова и снова, лимит быстро заканчивается, и даже после исправления настоящей причины сертификат не выпустится.
Решение: подождите час и попробуйте снова — но только после того, как нашли и исправили причину. Похожая ошибка too many certificates already issued означает, что за последнюю неделю для этого же набора доменов уже выпустили 5 сертификатов. В этом случае ждать придется дольше — до полутора суток. Точное время, после которого можно повторить попытку, обычно указано в самом тексте ошибки.
Если ошибка без подробностей или плавающая
Панели управления часто показывают общую ошибку вроде «Verification failed for the following domain(s)» без пояснений. Бывает и так, что сертификат то выпускается, то нет. Тогда проверьте по порядку:
- DNS уже обновился. Если вы недавно сменили IP-адрес домена, старые данные могут храниться еще несколько часов. Проверьте адрес через dns.google и повторите выпуск, когда там будет новый IP.
- www и другие поддомены ведут на сервер. Панели часто добавляют www.example.com в сертификат автоматически. Если www указывает на парковочную страницу регистратора, проверка не пройдет. Направьте www на ваш сервер или уберите его из сертификата.
- Нет лишней записи AAAA. Если у домена есть IPv6-адрес, Let's Encrypt проверяет сначала его, а на IPv4 переключается только при таймауте. Когда AAAA-запись осталась от старого сервера или по IPv6 отвечает другой сайт, проверка не пройдет. Удалите лишнюю запись или настройте сайт и по IPv6.
- Нет записи CAA, которая запрещает Let's Encrypt. Ее легко пропустить, если DNS настраивал кто-то другой.
- Проверочная папка доступна. Создайте тестовый файл и откройте его в браузере по HTTP — должен показаться текст test, а не ошибка 404 или главная страница сайта.
- Порт 80 открыт для всего мира. Let's Encrypt проверяет домен с серверов в разных странах, поэтому сайт должен быть доступен не только из вашей.
- Прокси Cloudflare не мешает. Если домен подключен к Cloudflare с включенным проксированием, на время выпуска переключите запись в режим «DNS only».
- Лимит попыток не исчерпан. Если вы уже несколько раз подряд пытались выпустить сертификат, подождите час.
Проверить проверочную папку можно так — создайте файл в корневой папке сайта и запросите его:
mkdir -p .well-known/acme-challenge
echo test > .well-known/acme-challenge/test.txt
curl http://example.com/.well-known/acme-challenge/test.txt
Не забудьте удалить тестовый файл после проверки.
Подробную причину почти всегда можно найти в логах. У certbot это файл /var/log/letsencrypt/letsencrypt.log, а у панелей управления — свой раздел логов или отдельная папка в /var/log. В логе указан конкретный домен, который не прошел проверку, и что Let's Encrypt получил в ответ.
Итог
Почти все ошибки Let's Encrypt означают одно: проверочный файл не удалось получить по HTTP. Если в ошибке есть подробности — ищите решение по ее тексту. Если ошибка общая или плавающая — проверьте DNS, www, AAAA и CAA, доступность папки /.well-known/acme-challenge/ и порта 80, а перед повторной попыткой подождите час, чтобы не упереться в лимит.
🔒 Если сертификат все равно не выпускается, напишите мне — разберусь и настрою HTTPS.
Опубликовано