Ошибка 403 ACME-челлендж Let's Encrypt win-acme
Решение ошибки 403 при проверке ACME-челленджа в win-acme и Let's Encrypt. Настройка Apache/Nginx: исключите /.well-known из редиректов, Require all granted, тесты curl, firewall, IPv6. Полный гайд по диагностике и фиксу.
Проблема с win-acme и Let’s Encrypt: ошибка 403 при проверке ACME-челленджа (unauthorized)
Уже сутки не могу обновить сертификат Let’s Encrypt через win-acme.
Описание проблемы:
- Сертификат истек, запускаю запрос на выпуск.
- Файл челленджа появляется в
.well-known/acme-challenge/. - В логах Apache виден запрос к файлу (но с локальным адресом).
- win-acme выдает ошибку:
[cab2023.example.ru] {"type":"urn:ietf:params:acme:error:unauthorized","detail":": Invalid response from cab2023.example.ru/well-known/acme-challenge/хххххххххххххххххххххххххххххххххххххххх: 403","status":403,"instance":null}
Пробовал с Apache и Nginx — та же ошибка.
Конфиг Apache для порта 80:
ServerName cab2023.example.ru
ServerAlias cab2023.example.ru
DocumentRoot "E:/1"
# Сначала — разрешаем доступ к ACME
Alias /.well-known/acme-challenge "E:/1/.well-known/acme-challenge"
<Directory "E:/1/.well-known/acme-challenge">
Options None
AllowOverride None
Require all granted
</Directory>
# Редирект с HTTPS на HTTP
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Настройки директорий
<Directory "E:/1">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
Конфиг Apache для порта 443:
ServerName cab2023.example.ru
ServerAlias cab2023.example.ru
SSLEngine On
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
# Игнорирование ошибок сертификата (для тестирования)
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
SSLCertificateFile "e:/2/cab2023.example.ru-crt.pem"
SSLCertificateKeyFile "e:/2/cab2023.example-key.pem"
# Логирование SSL для отладки
LogLevel warn ssl:warn
# Редирект ВСЕХ HTTPS запросов на HTTP
RewriteEngine On
RewriteRule ^(.*)$ http://cab2023.example.ru$1 [R=301,L]
# Дополнительный заголовок для отладки
Header always set X-SSL-Redirect "https-to-http"
Редирект с 443 на 80 настроен, чтобы избежать NET::ERR_CERT_DATE_INVALID, но челлендж все равно не проходит.
Вопрос: Что не так с конфигурацией? Как правильно настроить Apache (или Nginx) для успешной валидации Let’s Encrypt через win-acme?
Ошибка 403 при проверке ACME-челленджа в win-acme и Let’s Encrypt обычно возникает из-за блокировки доступа к пути /.well-known/acme-challenge/ на сервере Apache или Nginx — редиректы, права файлов или firewall мешают CA-серверам достать токен. В вашем конфиге проблема в редиректах на портах 80/443, которые перехватывают запросы, плюс возможны нюансы с правами на Windows-диске E:. Исправьте, добавив исключения для ACME-пути перед редиректами и проверив публичный доступ curl’ом — сертификат обновится за минуту.
Содержание
- Почему ошибка 403 блокирует ACME-челлендж Let’s Encrypt
- Диагностика: что проверить в логах и сетью
- Правильная настройка Apache для win-acme
- Настройка Nginx — если переходим на него
- Тесты и отладка на Windows
- Другие причины 403 и как их обойти
- Источники
- Заключение
Почему ошибка 403 блокирует ACME-челлендж Let’s Encrypt
Представьте: win-acme кладёт файл в /.well-known/acme-challenge/, но сервер Let’s Encrypt стучится по HTTP (порт 80), а получает 403 Forbidden. Почему? Чаще всего сервер сам себя блокирует.
В вашем случае логи Apache показывают запрос с локальным адресом — это намёк, что CA (или вы сами) проверяете не извне. Плюс редирект на 443 путает всё: там HTTPS с истёкшим cert’ом, и браузер/инструмент может фейлить. Из официальной документации win-acme ясно: если сайт требует SSL везде, отключите это для /.well-known/acme-challenge/. Аналогично в Certify The Web: 403 — от вашего веб-приложения или файрвола, который блочит порт 80.
Коротко, топ-причины:
- Редиректы HTTP→HTTPS или наоборот перехватывают ACME-запрос.
- Права на каталог (Windows NTFS строгие).
- Nginx/Apache по умолчанию блочит dot-пути вроде
.well-known. - Firewall или WAF (Cloudflare?) режет трафик извне.
Без фикса валидация http-01 всегда фейлит.
Диагностика: что проверить в логах и сетью
Сначала не меняйте конфиг — проверьте, видит ли мир ваш челлендж. Запустите win-acme в тестовом режиме (--test), чтобы не ждать лимитов Let’s Encrypt.
- Создайте тестовый файл вручную:
echo "test-token" > E:/1/.well-known/acme-challenge/test123
- Проверьте локально:
curl http://cab2023.example.ru/.well-known/acme-challenge/test123
Должно выдать “test-token”. Если 403 — локальная блокировка.
- Извне (критично!):
curl -I http://cab2023.example.ru/.well-known/acme-challenge/test123
Используйте другой ПК/сервер. Или онлайн: https://letsdebug.net/ — введите домен, увидите, что блочит (IPv6? Порт 80?).
-
Логи Apache:
Вerror_logищите “client denied by server configuration” или пути вроде/var/lib/letsencrypt. В вашем конфиге редирект на 443 может петлить:RewriteCond %{HTTPS} onсрабатывает редко на 80. -
Проверьте DNS и IP:
dig cab2023.example.ru
nslookup cab2023.example.ru 8.8.8.8
Убедитесь, что A/AAAA записи ведут на ваш публичный IP. Let’s Encrypt шлёт запросы с разных гео — IPv6 часто фейлит.
Если curl извне даёт 403 — копайте сервер. Локально ок, извне нет — файрвол/провайдер.
Правильная настройка Apache для win-acme
Ваш конфиг почти ок, но редиректы везде — убийцы. Alias должен быть первым, до Rewrite. Плюс на 443 не редиректируйте ACME (хотя валидация HTTP-only).
Порт 80 (обновлённый конфиг):
ServerName cab2023.example.ru
DocumentRoot "E:/1"
# ACME ПЕРВЫМ — без редиректов!
Alias /.well-known/acme-challenge "E:/1/.well-known/acme-challenge"
<Directory "E:/1/.well-known/acme-challenge">
Options None
AllowOverride None
Require all granted
ForceType text/plain # Важно для win-acme
</Directory>
# ТЕПЕРЬ редирект на HTTPS (но не для ACME!)
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
<Directory "E:/1">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Порт 443 (уберите редирект на HTTP — бессмысленно):
ServerName cab2023.example.ru
SSLEngine On
# Ваши cert'ы...
# НЕ редиректите ACME (на всякий)
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge [NC]
# Если нужно — другие правила
LogLevel warn ssl:warn rewrite:trace3 # Для отладки
Перезапустите Apache (httpd -k restart). Права на E:/1/.well-known: IIS_IUSRS или Everyone — read. Из Server Fault примера: именно Require all granted + Alias фиксит 403.
После — запустите win-acme renew.
Настройка Nginx — если переходим на него
Пробовали Nginx? Часто проще. Вы упомянули — та же 403, но фикс в location.
server для 80:
server {
listen 80;
server_name cab2023.example.ru;
# ACME первым!
location ^~ /.well-known/acme-challenge/ {
root /e/1; # Ваш DocumentRoot
allow all;
default_type text/plain;
}
# Остальное — на HTTPS
location / {
return 301 https://$host$request_uri;
}
}
Из GitHub spec issue: Nginx блочит dot-пути — ^~ и allow all решает. Тестировали? Если да — покажите логи error_log.
Тесты и отладка на Windows
Windows — отдельный ад: NTFS-права, UAC, Windows Firewall.
- Firewall:
netsh advfirewall firewall add rule name="ACME80" dir=in action=allow protocol=TCP localport=80 - Права: Правой кнопкой на E:/1/.well-known → Properties → Security → IIS_IUSRS (read/execute).
- IPv6: Отключите в Apache или проверьте
curl -6 http://... - LetsDebug: letsdebug.net — покажет 403 от WAF или портов.
win-acme лог: --verbose для деталей. Если “SelfHosting” — он сам хостит, но 403 от вашего сервера.
Другие причины 403 и как их обойти
- WAF/CDN: Cloudflare? Поставьте “SSL/TLS → Full (strict)”, но откройте /.well-known.
- Хостинг: Провайдер блочит 80? Спросите support.
- IPv6 mapping: CA видит AAAA, но сервер не отвечает — удали AAAA в DNS.
- Авторизация: Уберите basic auth для ACME.
Из ownCloud docs: RedirectMatch 404 для защиты, но allow для токенов.
Источники
- win-acme Manual - Validation problems
- Certify The Web - HTTP Domain Validation
- LE spec issue - Nginx .well-known 403
- Stack Overflow - LE 403 Forbidden
- Server Fault - Apache ACME Alias
- ownCloud - Apache Let’s Encrypt
- PHComp - Apache ACME config
- Mailu GitHub - Nginx ACME proxy
Заключение
Фикс ошибки 403 в ACME-челлендже win-acme — это исключение /.well-known из редиректов, Require all granted и тест curl извне. После обновлённого Apache конфига сертификат Let’s Encrypt обновится без проблем. Если не сработает — киньте свежие логи/curl, разберёмся. Главное: порт 80 открыт миру, без петель редиректов. Удачи с cert’ом!