proxy_ssl_server_name не работает: причины, решения и FAQ

Что такое proxy_ssl_server_name и почему он важен

Директива proxy_ssl_server_name в Nginx играет критическую роль при работе с SSL/TLS проксированием. Она указывает серверу передавать имя хоста (Server Name Indication или SNI) при установке защищённого соединения с бэкендом. Без корректной настройки SNI современные серверы могут отвергать соединения, вызывая ошибки типа SSL handshake failed. Это особенно актуально для виртуальных хостингов, где одно IP-адрес обслуживает несколько доменов.

Основные причины сбоя proxy_ssl_server_name

  • Устаревшая версия Nginx: SNI поддержка требует Nginx 1.7.0 или выше. В более старых сборках директива игнорируется.
  • Отсутствие proxy_ssl: Без включённой директивы proxy_ssl on параметры SSL/TLS не активируются.
  • Конфликт с proxy_ssl_name: Одновременное использование proxy_ssl_name переопределяет значение proxy_ssl_server_name.
  • Некорректное размещение: Директива должна находиться внутри блока location или server, а не в главном конфиге.
  • Ошибки в DNS: Неразрешимое имя хоста в директиве приводит к сбою TLS-рукопожатия.

Пошаговое решение проблем с proxy_ssl_server_name

  1. Проверьте версию Nginx: Выполните nginx -v. Если версия ниже 1.7.0 – обновите сервер.
  2. Активируйте proxy_ssl: Добавьте proxy_ssl on; в конфигурацию блока location.
  3. Уберите конфликтующие директивы: Удалите или закомментируйте proxy_ssl_name если используется proxy_ssl_server_name.
  4. Проверьте синтаксис: Убедитесь, что директива указана внутри server/location:
    location / {
      proxy_pass https://backend;
      proxy_ssl_server_name on;
    }
  5. Тестируйте DNS: Используйте nslookup your-backend.com для проверки разрешения имени.
  6. Анализируйте логи: Ищите ошибки SSL в /var/log/nginx/error.log (например, “SSL_do_handshake() failed”).

Рабочие примеры конфигурации Nginx

Базовая настройка для HTTPS-прокси:

server {
  listen 443 ssl;
  server_name example.com;
  
  location / {
    proxy_pass https://backend-service;
    proxy_ssl_server_name on;
    proxy_ssl on;
    proxy_ssl_protocols TLSv1.2 TLSv1.3;
    proxy_ssl_verify off; # Для тестов, в продакшене используйте валидацию
  }
}

Важно: Всегда включайте proxy_ssl_verify в рабочих средах с корректными сертификатами.

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

Q: В чём разница между proxy_ssl_name и proxy_ssl_server_name?
A: proxy_ssl_name явно задаёт имя хоста для SNI, тогда как proxy_ssl_server_name включает автоматическую передачу имени из proxy_pass.

Q: Почему SNI не передаётся, хотя директива включена?
A: Проверьте версию OpenSSL на сервере (требуется 0.9.8f+). Используйте openssl version. Также убедитесь, что бэкенд принимает SNI.

Q: Как проверить, что SNI работает?
A: Используйте Wireshark или команду: openssl s_client -connect backend:443 -servername your.domain. Ищите строку “TLS server name” в выводе.

Q: Может ли проблема быть в бэкенде, а не в Nginx?
A: Да. Если бэкенд использует устаревшее ПО (например, старые версии Apache без SNI), соединение будет падать. Тестируйте прямое подключение к бэкенду.

Q: Обязательно ли отключать proxy_ssl_verify?
A: Нет! Отключайте (off) только для диагностики. В продакшене всегда включайте проверку и укажите proxy_ssl_trusted_certificate.

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