Proxy_ssl_server_name в Apache: Полное руководство по настройке и устранению ошибок

Что такое 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: Пошаговое руководство

  1. Активируйте необходимые модули:
    sudo a2enmod proxy
    sudo a2enmod proxy_http
    sudo a2enmod ssl
  2. Добавьте конфигурацию в VirtualHost:
    <VirtualHost *:443>
      ServerName your-domain.com
      SSLProxyEngine On
      ProxyPass "/" "https://backend-server/"
      ProxyPassReverse "/" "https://backend-server/"
      ProxySSLServerName On
      # Дополнительные SSL-настройки
    </VirtualHost>
  3. Проверьте синтаксис и перезагрузите 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-рукопожатии.

Proxy Ninja
Добавить комментарий