Что такое proxy_ssl_server_name в Apache?
Директива proxy_ssl_server_name
в веб-сервере Apache играет критическую роль при работе с обратным прокси и SSL/TLS. Она активирует передачу имени сервера (Server Name Indication, SNI) при проксировании HTTPS-запросов к backend-серверам. Без этой настройки Apache отправляет запросы без SNI, что вызывает ошибки сертификатов, особенно если бэкенд использует виртуальные хосты с разными SSL-сертификатами.
Принцип работы директивы proxy_ssl_server_name
Когда Apache выступает как обратный прокси для HTTPS-трафика:
- Клиент отправляет запрос с SNI (например,
example.com
) - Без
proxy_ssl_server_name on
Apache соединяется с бэкендом БЕЗ передачи исходного SNI - Бэкенд получает “пустой” SNI и возвращает сертификат по умолчанию, что вызывает ошибку несоответствия
- С включённой директивой Apache передаёт оригинальное SNI бэкенду, обеспечивая корректное SSL-рукопожатие
Настройка proxy_ssl_server_name: Пошаговое руководство
- Активируйте необходимые модули:
sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod ssl
- Добавьте конфигурацию в VirtualHost:
<VirtualHost *:443> ServerName your-domain.com SSLProxyEngine On ProxyPass "/" "https://backend-server/" ProxyPassReverse "/" "https://backend-server/" ProxySSLServerName On # Дополнительные SSL-настройки </VirtualHost>
- Проверьте синтаксис и перезагрузите Apache:
sudo apachectl configtest sudo systemctl reload apache2
Примеры конфигурации с proxy_ssl_server_name
Сценарий 1: Проксирование на несколько бэкендов с разными доменами
ProxyPass "/app1" "https://backend1.domain.com/"
ProxyPassReverse "/app1" "https://backend1.domain.com/"
ProxyPass "/app2" "https://backend2.domain.net/"
ProxyPassReverse "/app2" "https://backend2.domain.net/"
ProxySSLServerName On
Сценарий 2: Комплексная настройка с верификацией сертификатов
SSLProxyCACertificateFile "/path/to/ca-bundle.crt"
SSLProxyCheckPeerCN on
SSLProxyCheckPeerName on
ProxySSLServerName On
Распространенные проблемы и их решения
- Ошибка 502 Bad Gateway:
- Причина: Бэкенд отклоняет соединение из-за несовпадения SNI
- Решение: Активируйте
ProxySSLServerName On
- SSL_ERROR_BAD_CERT_DOMAIN в браузере:
- Причина: Бэкенд возвращает сертификат для другого домена
- Решение: Проверьте корректность передачи SNI через
openssl s_client -connect backend:443 -servername your-domain.com
- Директива игнорируется:
- Причина: Отсутствие
SSLProxyEngine On
- Решение: Включите SSLProxyEngine перед ProxySSLServerName
- Причина: Отсутствие
Часто задаваемые вопросы (FAQ)
Q: В каких версиях Apache доступен proxy_ssl_server_name?
A: Директива поддерживается в Apache 2.4.31 и новее. Для более старых версий используйте ProxySet
с параметром ssl-servername
.
Q: Обязательно ли отключать проверку сертификатов (ProxySSLVerify none)?
A: Нет! Отключайте проверку только для тестирования. В production всегда используйте SSLProxyVerify require
с корректными CA-сертификатами.
Q: Как проверить, что SNI передаётся корректно?
A: Используйте команду в терминале:
openssl s_client -connect backend_ip:443 -servername your_domain.com -showcerts
В выводе ищите строку Server certificate
с ожидаемым доменом.
Q: Можно ли использовать proxy_ssl_server_name с HTTP/2?
A: Да, директива полностью совместима с HTTP/2 при условии, что бэкенд поддерживает этот протокол.
Q: Чем отличается от ProxyPreserveHost?
A: ProxyPreserveHost
передаёт оригинальный заголовок Host в HTTP-запросе, а proxy_ssl_server_name
управляет исключительно SNI в TLS-рукопожатии.