proxy_ssl_server_name в Nginx Upstream: Полное руководство по настройке SSL

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

Директива proxy_ssl_server_name в Nginx играет критическую роль при работе с SSL/TLS-шифрованием в upstream-блоках. Она указывает, должен ли Nginx передавать имя сервера (SNI – Server Name Indication) при проксировании HTTPS-запросов к бэкенд-серверам. По умолчанию (proxy_ssl_server_name off) Nginx не отправляет SNI, что может вызвать ошибки при работе с виртуальными хостами на бэкенде.

Зачем нужен proxy_ssl_server_name при работе с upstream?

Активация proxy_ssl_server_name on решает две ключевые проблемы:

  • Поддержка виртуальных хостов: Без SNI бэкенд-сервер не может определить, для какого домена запрашивается сертификат.
  • Совместимость с современными стандартами: TLS-рукопожатие требует SNI для корректной работы с мультидоменными сертификатами.
  • Предотвращение ошибок 502: Отсутствие SNI часто вызывает сбои вида “SSL_do_handshake() failed”.

Как настроить proxy_ssl_server_name для upstream серверов

Базовая конфигурация включает три шага:

  1. Определите upstream-блок с серверами бэкенда
  2. В секции location включите proxy_ssl_server_name on
  3. Убедитесь, что proxy_ssl_name соответствует домену сертификата бэкенда

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

upstream backend_servers {
  server 192.168.1.10:443;
  server 192.168.1.11:443;
}

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass https://backend_servers;
    proxy_ssl_server_name on;
    proxy_ssl_name backend-domain.com; # Домен сертификата бэкенда
    proxy_ssl_verify on; # Опциональная проверка сертификата
  }
}

Важные нюансы:

  • Все upstream-серверы должны использовать одинаковое доменное имя в сертификатах
  • Для proxy_ssl_verify требуется указать proxy_ssl_trusted_certificate
  • Порт бэкенда должен явно указываться как 443

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

  • Ошибка “certificate doesn’t match”: Проверьте соответствие proxy_ssl_name и домена в сертификате бэкенда.
  • Сбои при балансировке: Убедитесь, что все ноды upstream поддерживают SNI.
  • Проблемы с старыми OpenSSL: Обновите Nginx до версии ≥ 1.7.5 (минимальная для поддержки директивы).

FAQ: Часто задаваемые вопросы

Q: Обязательно ли использовать proxy_ssl_server_name для HTTP/2?
A: Да, HTTP/2 требует строгого соответствия SNI и домена в сертификате.

Q: Можно ли использовать разные имена для proxy_ssl_name и server_name?
A: Да, proxy_ssl_name должен соответствовать домену сертификата бэкенда, а server_name – публичному домену сайта.

Q: Как проверить, отправляется ли SNI?
A: Используйте openssl s_client -connect backend:443 -servername domain.com и проверьте поле “Server certificate”.

Q: Работает ли это с самоподписанными сертификатами?
A: Да, но требуется добавить CA в proxy_ssl_trusted_certificate при включенной проверке.

Q: Что важнее: proxy_ssl_server_name или proxy_ssl_name?
A: proxy_ssl_server_name on активирует отправку SNI, а proxy_ssl_name задаёт конкретное значение для отправки.

Заключение

Настройка proxy_ssl_server_name on критична для безопасного проксирования HTTPS-трафика через Nginx upstream. Она обеспечивает корректное TLS-рукопожатие, предотвращает ошибки 502 и поддерживает современные стандарты шифрования. Всегда проверяйте соответствие доменных имён в proxy_ssl_name и сертификатах бэкенда, особенно при работе с балансировкой нагрузки и HTTP/2.

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