Гид по технологиям

Как настроить SSL vhosts в Nginx с поддержкой SNI на Ubuntu 11.04 и Debian Squeeze

• 6 min read • Серверы • Обновлено 23 Nov 2025
Настройка SSL vhosts в Nginx с поддержкой SNI
Настройка SSL vhosts в Nginx с поддержкой SNI

Version 1.0
Author: Falko Timme
Follow me on Twitter

Введение

В этой статье показано, как настроить SSL vhosts в nginx на Ubuntu 11.04 и Debian Squeeze, чтобы сайт был доступен по HTTPS (порт 443). SSL — это Secure Sockets Layer, криптографический протокол, обеспечивающий шифрование транспортного соединения. Также описано, как использовать SNI (Server Name Indication), чтобы разрешить несколько SSL-виртуальных хостов на одном IP.

Важно: материалы предоставляются “как есть” — без гарантий работоспособности на вашей системе.

Кому это подходит

Коротко: системным администраторам и разработчикам, которые управляют nginx на Ubuntu 11.04 / Debian Squeeze и хотят добавить HTTPS для сайтов, включая размещение нескольких сертификатов на одном IP с помощью SNI.

1 Предварительная заметка

Я предполагаю, что nginx уже установлен и работает, как показано в соответствующих руководствах по установке nginx + PHP5/ PHP-FPM и MySQL для Ubuntu 11.04 и Debian Squeeze.

В примерах буду настраивать vhost для домена www.hostmauritius.com (замените на ваш домен). Сначала покажу создание самоподписанного сертификата (браузеры выдадут предупреждение), затем — установку сертификата от доверенного CA. В качестве примера CA упомяну CAcert.org: сертификаты там бесплатны, но не во всех браузерах распознаются.

Традиционно на одном IP был возможен только один SSL-сертификат; сейчас это можно обойти с помощью SNI. Учтите, что SNI не поддерживается некоторыми старыми браузерами/ОС — см. раздел совместимости.

Чтобы узнать, поддерживает ли ваш браузер SNI, можно перейти на: https://alice.sni.velox.ch/

Во всех примерах подразумеваются root-привилегии. На Ubuntu используйте:

sudo su

чтобы стать root-пользователем.

2 Определение версии nginx

Нужно знать версию nginx — конфигурация SSL отличается для версий < 0.8.21 и >= 0.8.21.

nginx -v

Примеры из исходного руководства: на Ubuntu 11.04 — nginx 0.8.54, на Debian Squeeze — nginx 0.7.67.

3 Настройка vhost

Создадим vhost для www.hostmauritius.com с корнем документа /var/www/www.hostmauritius.com/web. Сначала создаём директорию:

mkdir -p /var/www/www.hostmauritius.com/web

Создадим простой конфиг nginx для HTTP (порт 80):

vi /etc/nginx/sites-available/www.hostmauritius.com.vhost
server {
        listen   80; ## listen for ipv4
        listen   [::]:80; ## listen for ipv6

        server_name  www.hostmauritius.com hostmauritius.com;
        root /var/www/www.hostmauritius.com/web;

        if ($http_host != "www.hostmauritius.com") {
                 rewrite ^ http://www.hostmauritius.com$request_uri permanent;
        }

        location / {
                index  index.php index.html index.htm;
        }

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
                include         fastcgi_params;
        }

        location ~ /\. {
                deny  all;
        }
}

Включаем vhost и перезагружаем nginx:

cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/www.hostmauritius.com.vhost www.hostmauritius.com.vhost
/etc/init.d/nginx reload

Важно: перед внесением изменений сделайте резервную копию конфигураций nginx.

4 Создание самоподписанного сертификата

Перед настройкой SSL нам нужен сертификат. Сначала убедитесь, что пакет ssl-cert установлен:

apt-get install ssl-cert

Создадим самоподписанный сертификат для www.hostmauritius.com:

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/www.hostmauritius.com.crt

При запросе укажите hostname: Host name: <– www.hostmauritius.com

Эта команда создаст самоподписанный сертификат и приватный ключ в одном файле: /etc/ssl/private/www.hostmauritius.com.crt

Можно посмотреть файл:

cat /etc/ssl/private/www.hostmauritius.com.crt
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsxOSdUsiEcay6M8EpSu5eeC797v/TpDRGnui4uaYd/YpjrPh
PWW01FEIpaCixYb5U2uMuvFOlmZhyfer+7qoJDeueuNW1sDCn/0pkOrdSWgfBuih
FkqXgau6KMDvuShcUkZ2ufMbMohiz+9ahMiqKBAxMeXijR7t9eqfmO3s+WGd65l8
5yoEDz+NNxk4w9SZmpIHu8vt37c7PX7fxZntxer56PvElz01gRj0xZsMYMlaHROQ
+q/d8p1g0CWTOjlgelQXxqEPGVGphYDMFd8gL5bNbCnJoCeF0CYK5w2Bf+Jfppgv
ub8AU8kMPNh/vyRm/7Ximc51dUSGWI/Xp39OcwIDAQABAoIBAA/U8SPRiqeLq5GN
i9mWbgVqavPR+RZXE0WGHLZ2sJAagT4OhSFKdpw2tc7+zqUr86r+XSjB4LLHRmn2
rYvJyse47IIMy0adMBe46A3Z1cqBnAyeUG+KFK7wIbsso4T5HoBfnmt+JK9pA2Ni
w9vtaa21EMRakJbtXxhYr9dzYXoCk3IcaRqQuDfPBTEfGRXocjHPIIUS9hTk+f13
F3P+pXummLREDJTUGTvSIxA8959EKXSwgwXV2VOEQbGgbjDFKTMYJZhq8H1tz8Ld
cYa5zxlbwFxAAeRzxXhycGs1W2rqo8wukhPKLcyYb7HIIZUdX1UDttr9fZAVkXOS
d0JSjrECgYEA3sWHwTHcrM4Cd5B2WJAmwrTxmaX0EIKXtm/4SsJ+6Cfw7YrDQwr1
2ERB21K/cv1DouToYjZm2MFNYbroPU4sWc8LD9E+Uf0YqFLBGVX4dqJeQZ76UZ/W
tVlZnX7uZnDZnxXDj+TDVK9P3h47jsVHvVhSLtJw77G68vNYDUUoIsUCgYEAzcmO
Gca34I3i/n4QFq4Wo3S5KIgJYz8erzMZrEsIOQih7jJbdklazWEZP1d2bMDCZGGz
5kpMxM0IuAp0CwWeIF9oGxv6g3p/St3c7jabjtAqa3WCQznE7q0PXxtXGlb2bbqz
TGW3pVWNDMuk1YbxO4f5DHfoaVQOaYwaaniHX9cCgYAzGKuirIUpPbdjJUd/2NCL
KGWiEGaCwvF5bwVMYIArT737PjC7V/A7wqw4Wip/fYfd/RMwM7ozTWMqX2yVYzDZ
CJxI7H2W4K6fLRwNa6Kp02Q7OPPBdSASSIQ9k7eq14eS7bMFdjs3WV7AW77daHKk
A3YWNz6gO+vdfeNcZ9hk4QKBgQC019CJ9Gk47Fe0ICKRW9HHOVdSOCJP1nNnsbd5
AsMqI9zyD8zyqUojvJXMZVdMASWTw4yt71OBi1GDMqSB3yD0AAPj9vVyv57Hsytp
KBISMftlTfH4k/btbKZahRNJsWyER5Mzqxv1LrZyrS+g+iJal4aUn3ddwKGdvaKl
OGB3JwKBgHePRBaMeMaZdCiCmLAxFD2/kOKs0OCBLVGCUT0QC/fbf4gYbEjsWKug
1Xz4AUj8gaC0udW8im12z06R5p7Mzpxo1I1wgHmYHcJ0Q0P9ntcuxrky5+3ANeLU
EKqOZRmINzLgCGcq6g7cUy1UEMoRNtwulSIaoBiXjteHvUKrUAe1
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICvDCCAaQCCQDSQb56L0fohTANBgkqhkiG9w0BAQUFADAgMR4wHAYDVQQDExV3
d3cuaG9zdG1hdXJpdGl1cy5jb20wHhcNMTEwOTA2MTA0MzIyWhcNMjEwOTAzMTA0
MzIyWjAgMR4wHAYDVQQDExV3d3cuaG9zdG1hdXJpdGl1cy5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzE5J1SyIRxrLozwSlK7l54Lv3u/9OkNEa
e6Li5ph39imOs+E9ZbTUUQiloKLFhvlTa4y68U6WZmHJ96v7uqgkN65641bWwMKf
/SmQ6t1JaB8G6KEWSpeBq7oowO+5KFxSRna58xsyiGLP71qEyKooEDEx5eKNHu31
6p+Y7ez5YZ3rmXznKgQPP403GTjD1Jmakge7y+3ftzs9ft/Fme3F6vno+8SXPTWB
GPTFmwxgyVodE5D6r93ynWDQJZM6OWB6VBfGoQ8ZUamFgMwV3yAvls1sKcmgJ4XQ
JgrnDYF/4l+mmC+5vwBTyQw82H+/JGb/teKZznV1RIZYj9enf05zAgMBAAEwDQYJ
KoZIhvcNAQEFBQADggEBAEA+HD4u5MIQJ0q3BoXedfqh7z9yqUdBdVXMNYTdEFwn
ZlLWy+QkitFMU3M6KsBBwtGO1655kkDOguiSFYBKxVxzEIMx6kV6AH26ALzVhBeF
PO6qJnxlTKPojiaolgrlndX9SUH4XD8EBqYuugJ0F1PEcuVDi5yXKwwyuaJw4Uyp
CzTU4sy6uduxVaFea0agBN92sy2gZPFPtvMZYJjy2TW1caUt9WLh0l0cPYvW+hPk
K2T1sGxW5WOhcwrIRqa8HSkyxXOz1NJZNSXi/yVN4iNMY0nTf0gPP4X1Rl4+OcZk
imxe4O9Eu49lEGQ8UipEaGNJ5gD6BECwz5amq64rdqU=
-----END CERTIFICATE-----

Далее мы разнесём приватный ключ и сертификат в отдельные файлы: приватный ключ /etc/ssl/private/www.hostmauritius.com.key и сам сертификат /etc/ssl/certs/www.hostmauritius.com.pem.

vi /etc/ssl/private/www.hostmauritius.com.key

Файл должен содержать часть от —–BEGIN RSA PRIVATE KEY—– до —–END RSA PRIVATE KEY—– (см. вывод выше).

Затем установим права: ключ должен быть доступен только root:

chmod 600 /etc/ssl/private/www.hostmauritius.com.key

Создаём файл сертификата:

vi /etc/ssl/certs/www.hostmauritius.com.pem

В этот файл помещаем часть от —–BEGIN CERTIFICATE—– до —–END CERTIFICATE—– (см. вывод выше).

После этого можно удалить объединённый файл:

rm -f /etc/ssl/private/www.hostmauritius.com.crt

5 Пример конфигурации SSL vhost для nginx

Ниже — минимальный пример server-блока для SSL (порт 443). Настройте пути к ключу и сертификату согласно вашим файлам.

server {
    listen 443 ssl;
    server_name www.hostmauritius.com;

    ssl_certificate /etc/ssl/certs/www.hostmauritius.com.pem;
    ssl_certificate_key /etc/ssl/private/www.hostmauritius.com.key;

    root /var/www/www.hostmauritius.com/web;

    location / {
        index index.php index.html index.htm;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
        include fastcgi_params;
    }
}

Если ваш nginx собран с поддержкой SNI (современные сборки), вы можете просто добавить второй server-блок с другим ssl_certificate/ssl_certificate_key, и nginx будет обслуживать оба сертификата на одном IP при условии, что клиент поддерживает SNI.

Совместимость SNI

Поддержка SNI зависит от браузера и ОС. Клиенты с поддержкой SNI (примерный список):

  • Opera 8.0 и новее (при включенном TLS 1.1)
  • Internet Explorer 7 и новее (только под Windows Vista и новее, не в Windows XP)
  • Firefox 2.0 и новее
  • Curl 7.18.1 и новее (при сборке с поддержкой SNI в SSL/TLS-библиотеке)
  • Chrome 6.0 и новее (на всех платформах; старые релизы имели ограниченную поддержку)
  • Safari 3.0 и новее (OS X 10.5.6+ и Windows Vista+)

Если пользователь использует устаревший браузер или ОС без поддержки SNI, он может получить сертификат другого виртуального хоста или сообщение о проблеме с безопасностью.

Important: Internet Explorer на Windows XP не поддерживает SNI.

Дополнительные варианты и рекомендации

  1. Когда SNI не подходит
  • Для клиентов без SNI (старые браузеры) применяют выделенные IP-адреса: назначьте отдельный публичный IP каждому SSL-сайту.
  • Используйте сертификат с множеством SAN (Subject Alternative Names) или wildcard-сертификат (*.example.com), если это приемлемо.
  1. Альтернативные подходы
  • Wildcard-сертификат: покрывает все поддомены одного домена.
  • SAN-сертификат: один сертификат содержит несколько доменов.
  • Несколько IP: классическое решение для полной совместимости.
  1. Модель мышления (mental model)

SNI — это расширение TLS, которое позволяет клиенту указать имя сервера в момент рукопожатия TLS. Сервер (nginx) получает это имя и может выбрать соответствующий сертификат; без SNI сервер не знает, какой сертификат послать до завершения рукопожатия.

  1. Рольовые чек-листы

Администратор:

  • Проверить версию nginx и сборку на поддержку SSL/SNI.
  • Создать директории и правильно выставить права (ключи — 600).
  • Настроить конфиги в sites-available и включить их в sites-enabled.
  • Перезагрузить nginx и проверить логи на ошибки.

Разработчик/QA:

  • Проверить доступность сайта по HTTPS.
  • Проверить редиректы с HTTP на HTTPS.
  • Тестировать поведение в браузерах без SNI.
  1. Безопасность и жёсткие настройки
  • Используйте современные настройки TLS: отключите SSLv2/SSLv3, включите TLS 1.2/1.3 если доступно.
  • Подключите strong cipher suite и order preference (preferring server ciphers).
  • Регулярно обновляйте nginx и системные библиотеки OpenSSL/LibreSSL.
  1. Факты и ключевые числа
  • Порты: HTTP — 80, HTTPS — 443.
  • Права на приватный ключ: chmod 600.
  • Критическая версия nginx для некоторых отличий в конфигурации: 0.8.21.

Примеры проблем и как их решать

  • Клиенты видят сертификат другого сайта: вероятнее всего клиент не поддерживает SNI или nginx неправильно сопоставляет server_name. Решение: выделить IP или использовать SAN/wildcard сертификат.
  • nginx не перезагружается после добавления конфигурации: проверить синтаксис конфигов через nginx -t и логи /var/log/nginx/error.log.

Краткое резюме

  • Создайте vhost для HTTP и проверьте работу сайта по порту 80.
  • Сгенерируйте самоподписанный сертификат для тестирования, затем разнесите ключ и сертификат в отдельные файлы.
  • Настройте SSL server-блок в nginx и укажите ssl_certificate и ssl_certificate_key.
  • Для размещения нескольких SSL-хостов на одном IP используйте SNI, но учитывайте несовместимость со старыми клиентами — при необходимости используйте выделенные IP или SAN/wildcard сертификаты.

Заметка: это руководство ориентировано на Ubuntu 11.04 / Debian Squeeze и приведённые версии nginx; для современных дистрибутивов используйте актуальные пакеты и рекомендованные настройки TLS.

Полезные команды проверки и отладки

  • Проверка конфигурации nginx:
nginx -t
  • Перезапуск/перезагрузка сервисов:
/etc/init.d/nginx reload
  • Просмотр логов ошибок:
tail -f /var/log/nginx/error.log

Важно: перед внесением изменений делайте резервные копии конфигураций и ключей.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро