Как настроить SSL vhosts в Nginx с поддержкой SNI на Ubuntu 11.04 и Debian Squeeze
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.vhostserver {
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.crt5 Пример конфигурации 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.
Дополнительные варианты и рекомендации
- Когда SNI не подходит
- Для клиентов без SNI (старые браузеры) применяют выделенные IP-адреса: назначьте отдельный публичный IP каждому SSL-сайту.
- Используйте сертификат с множеством SAN (Subject Alternative Names) или wildcard-сертификат (*.example.com), если это приемлемо.
- Альтернативные подходы
- Wildcard-сертификат: покрывает все поддомены одного домена.
- SAN-сертификат: один сертификат содержит несколько доменов.
- Несколько IP: классическое решение для полной совместимости.
- Модель мышления (mental model)
SNI — это расширение TLS, которое позволяет клиенту указать имя сервера в момент рукопожатия TLS. Сервер (nginx) получает это имя и может выбрать соответствующий сертификат; без SNI сервер не знает, какой сертификат послать до завершения рукопожатия.
- Рольовые чек-листы
Администратор:
- Проверить версию nginx и сборку на поддержку SSL/SNI.
- Создать директории и правильно выставить права (ключи — 600).
- Настроить конфиги в sites-available и включить их в sites-enabled.
- Перезагрузить nginx и проверить логи на ошибки.
Разработчик/QA:
- Проверить доступность сайта по HTTPS.
- Проверить редиректы с HTTP на HTTPS.
- Тестировать поведение в браузерах без SNI.
- Безопасность и жёсткие настройки
- Используйте современные настройки TLS: отключите SSLv2/SSLv3, включите TLS 1.2/1.3 если доступно.
- Подключите strong cipher suite и order preference (preferring server ciphers).
- Регулярно обновляйте nginx и системные библиотеки OpenSSL/LibreSSL.
- Факты и ключевые числа
- Порты: 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Важно: перед внесением изменений делайте резервные копии конфигураций и ключей.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента