Proxy_ssl_server_name on: Руководство с примерами настройки Nginx

Что такое proxy_ssl_server_name в Nginx?

Директива proxy_ssl_server_name в Nginx управляет передачей имени сервера (SNI) при проксировании HTTPS-трафика. Когда установлено значение on, Nginx включает поле Server Name Indication в TLS-рукопожатии, указывая доменное имя целевого сервера. Это критически важно для работы с виртуальными хостами и современными SSL/TLS-конфигурациями, где серверу необходимо знать, какой сертификат представлять клиенту.

Как работает proxy_ssl_server_name on: технические детали

При активации опции происходит следующее:

  1. Nginx извлекает домен из заголовка Host входящего запроса
  2. Добавляет это имя в расширение SNI при установке TLS-соединения с бэкенд-сервером
  3. Целевой сервер использует SNI для выбора корректного SSL-сертификата
  4. Шифрованное соединение устанавливается с правильным виртуальным хостом

Без этой директивы бэкенд может получить неверный сертификат или вернуть ошибку SSL_ERROR_UNRECOGNIZED_NAME_ALERT.

Пример конфигурации с proxy_ssl_server_name on

Рассмотрим практический сценарий проксирования на backend.example.com:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/example.crt;
    ssl_certificate_key /etc/ssl/private/example.key;

    location / {
        proxy_pass https://backend.example.com;
        proxy_ssl_server_name on;
        proxy_ssl_name backend.example.com;
        proxy_set_header Host $host;
    }
}

Ключевые элементы:

  • proxy_ssl_server_name on – активирует передачу SNI
  • proxy_ssl_name – явно задаёт имя сервера для SNI
  • proxy_set_header Host $host – сохраняет оригинальный заголовок Host

Когда необходимо включать proxy_ssl_server_name

Директива требуется в следующих случаях:

  1. Проксирование на бэкенды с несколькими SSL-виртуальными хостами
  2. Использование облачных балансировщиков (AWS ALB, GCP LB)
  3. Работа с CDN, требующими SNI
  4. Сертификаты Let’s Encrypt на бэкенд-серверах
  5. Обход ошибок “SSL handshake failed” при проксировании

Типичные ошибки и решения

Проблемы при настройке и их устранение:

  • Ошибка 502 Bad Gateway: Проверьте совпадение имени в proxy_ssl_name и действительного домена бэкенда
  • SSL_ERROR_UNRECOGNIZED_NAME_ALERT: Убедитесь, что на бэкенде установлен сертификат для указанного SNI
  • Несовпадение сертификатов: Используйте proxy_ssl_verify для проверки цепочки доверия
  • Устаревшие версии Nginx: Требуется Nginx 1.7.0+ для поддержки SNI

FAQ: Частые вопросы о proxy_ssl_server_name

Чем отличается proxy_ssl_name от proxy_ssl_server_name?

proxy_ssl_name явно задаёт имя сервера для SNI, тогда как proxy_ssl_server_name включает механизм передачи. Они используются совместно.

Обязательно ли указывать proxy_ssl_name при proxy_ssl_server_name on?

Нет, если не указан proxy_ssl_name, Nginx использует домен из proxy_pass. Но явное указание рекомендуется для избежания неоднозначностей.

Работает ли proxy_ssl_server_name с HTTP/2?

Да, SNI полностью поддерживается в HTTP/2. Директива корректно работает с современными протоколами.

Как проверить, что SNI передаётся корректно?

Используйте команду OpenSSL: openssl s_client -connect backend:443 -servername example.com. Проверьте поле “Server certificate” в выводе.

Можно ли использовать с самоподписанными сертификатами?

Да, но потребуется дополнительно настроить proxy_ssl_trusted_certificate для импорта CA.

Заключение

Директива proxy_ssl_server_name on – мощный инструмент для безопасного проксирования HTTPS-трафика в Nginx. Её правильная настройка обеспечивает корректную работу SNI, предотвращает ошибки SSL и поддерживает современные инфраструктуры с множеством виртуальных хостов. Всегда проверяйте совпадение имён в proxy_ssl_name и действительных доменов бэкенда, используйте актуальные версии Nginx и тестируйте конфигурацию через OpenSSL перед развёртыванием в production.

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