DevOps

Ошибка 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 выдает ошибку:
json
[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:

apache
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:

apache
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

Представьте: 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.

  1. Создайте тестовый файл вручную:
echo "test-token" > E:/1/.well-known/acme-challenge/test123
  1. Проверьте локально:
curl http://cab2023.example.ru/.well-known/acme-challenge/test123

Должно выдать “test-token”. Если 403 — локальная блокировка.

  1. Извне (критично!):
curl -I http://cab2023.example.ru/.well-known/acme-challenge/test123

Используйте другой ПК/сервер. Или онлайн: https://letsdebug.net/ — введите домен, увидите, что блочит (IPv6? Порт 80?).

  1. Логи Apache:
    В error_log ищите “client denied by server configuration” или пути вроде /var/lib/letsencrypt. В вашем конфиге редирект на 443 может петлить: RewriteCond %{HTTPS} on срабатывает редко на 80.

  2. Проверьте 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 (обновлённый конфиг):

apache
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 — бессмысленно):

apache
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:

nginx
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 для токенов.


Источники

  1. win-acme Manual - Validation problems
  2. Certify The Web - HTTP Domain Validation
  3. LE spec issue - Nginx .well-known 403
  4. Stack Overflow - LE 403 Forbidden
  5. Server Fault - Apache ACME Alias
  6. ownCloud - Apache Let’s Encrypt
  7. PHComp - Apache ACME config
  8. Mailu GitHub - Nginx ACME proxy

Заключение

Фикс ошибки 403 в ACME-челлендже win-acme — это исключение /.well-known из редиректов, Require all granted и тест curl извне. После обновлённого Apache конфига сертификат Let’s Encrypt обновится без проблем. Если не сработает — киньте свежие логи/curl, разберёмся. Главное: порт 80 открыт миру, без петель редиректов. Удачи с cert’ом!

Авторы
Проверено модерацией
Модерация
Ошибка 403 ACME-челлендж Let's Encrypt win-acme