Apache Error AH02032: Hostname via SNI and HTTP have no match — Решение
Клиент получает ошибку 400 Bad Request при попытке выполнить защищенное HTTPS-соединение. В error.log Apache регистрируется нарушение соответствия заголовков безопасности: [ssl:error] [pid 1234:tid 5678] [client ...] AH02032: Hostname site-a.com provided via SNI and hostname site-b.com provided via HTTP have no match.
| Уровень протокола | Переданное имя хоста | Сущность |
|---|---|---|
| TLS Handshake (SNI) | site-a.com | Имя хоста в расширении Server Name Indication |
| HTTP/1.1 Header | Host: site-b.com | Заголовок Host внутри расшифрованного HTTP запроса |
| Результат проверки Apache | Несоответствие (Mismatch) | Блокировка запроса с кодом HTTP 400 |
- Apache принудительно обрывает запрос из соображений безопасности (защита от Domain Fronting и атак подмены виртуальных хостов).
- Сбой часто возникает при использовании некорректно настроенных обратных прокси (Reverse Proxy), CDN или самописных ботов/скриптов curl.
- Если запрос отправляется через cURL или скрипт автоматизации, убедитесь, что заголовок
Hostсовпадает с запрашиваемым доменом в URL:# ПРАВИЛЬНО: curl https://site-a.com/ # НЕПРАВИЛЬНО (вызывает AH02032): curl -H "Host: site-b.com" https://site-a.com/ - Если перед Apache установлен Nginx (в роли SSL-терминатора или Reverse Proxy), настройте корректную передачу SNI и заголовка Host в
nginx.conf:location / { proxy_pass https://backend_apache; proxy_set_header Host $host; proxy_ssl_server_name on; # Включает совпадение SNI прокси с $host proxy_ssl_name $host; } - Если между серверами используется CDN (Cloudflare, CloudFront), проверьте, чтобы Origin Host Header в настройках проксирования совпадал с именем сертификата на целевом сервере.
- Если требуется разрешить нестандартные перенаправления, проверьте конфигурацию виртуальных хостов Apache на предмет дублирующихся портов и пересекающихся
ServerAlias. - Перезагрузите веб-сервер:
sudo systemctl reload apache2 # или httpd.
Частые вопросы (FAQ)
Что такое SNI (Server Name Indication)?
SNI — это расширение протокола TLS, позволяющее клиенту передать доменное имя запрашиваемого сайта на этапе первоначального рукопожатия (до передачи HTTP-заголовков), чтобы сервер выбрал нужный SSL-сертификат.
Почему Apache возвращает именно ошибку 400 Bad Request?
Потому что передача разных доменов в SNI и заголовке Host рассматривается протоколом HTTP/1.1 и спецификацией TLS как поврежденный или потенциально вредоносный запрос.
Как протестировать SNI вручную через OpenSSL s_client?
Выполните команду: openssl s_client -connect 127.0.0.1:443 -servername site-a.com и затем отправьте команду GET / HTTP/1.1 с Host: site-a.com.
Можно ли отключить проверку соответствия SNI и Host в Apache?
В актуальных версиях Apache 2.4 эта проверка является частью ядра безопасности mod_ssl и жестко включена для предотвращения уязвимостей CVE.