Crossroads » Linux » SSL виртуальные хосты в Nginx

SSL виртуальные хосты в Nginx

  • Dislike
  • -1
  • Like
При использовании связки Nginx + Apache, где первый — front end, нередко возникает необходимость подключения к этой связке сайтов с поддержкой ssl (https). Для этого необходимо, чтобы Nginx корректно обрабатывал такие запросы.

Рассмотрим пример, при котором на сервере под Debian 7 располагаются 2 сайта (то есть больше одного) и доступ к обоим осуществляется по https протоколу.

Предполагается, что Nginx и Apache уже установлены и оба сайта доступны по http. В первую очередь убедитесь, что ваша сборка Nginx поддерживает SNI (Server Name Indication). В консоле введите nginx -V, после чего в выдаче, кроме всего прочего, должна быть следующая строка:
TLS SNI support enabled

В большинстве дистрибутивов Nginx поставляется именно в таком виде.

Если всё в порядке, то создаём в директории «nginx» папку для наших ключей.
mkdir -p /etc/nginx/ssl

Либо помещаем в неё имеющиеся сертификат и ключ, либо генерируем самоподписанный сертификат (что не имеет смысла для публичных сайтов, так как любой современный браузер не пустит пользователя на такой сайт без подтверждения).
cd /etc/nginx/ssl
openssl req -nodes -newkey rsa:2048 -keyout myserver.key -out server.csr

Заполняем соответствующие поля, после чего ключ и сертификат готовы.

Для Nginx создаём новый хост,
nano /etc/nginx/sites-available/ssl-example.com

конфигурация которого содержит примерно следующее:

server {

        listen   443;
        server_name example.com www.example.com;
        rewrite ^ https://$server_name$request_uri? permanent;

        root /usr/share/nginx/www/example.com;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/server.csr;
        ssl_certificate_key /etc/nginx/ssl/server.key;

error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /var/www/nginx-default;
    }

location / {
    proxy_pass http://127.0.0.1:8080/;
    proxy_redirect http://127.0.0.1:8080/ /;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

}
}


Из чего следует, что Nginx слушает 443-й порт и передаёт трафик в Apache, который слушает 8080-й порт. Поскольку и Nginx и Apache у нас на одном сервере, то не имеет смысл городить проксирование в Apache через https. То есть Apache у нас слушает один единственный порт и только его. Соответственно ssl хосты из Apache нужно убрать (если таковые есть). А так же отредактировать «ports.conf» для Apache, убрав из него строки «NameVirtualHost *:443» и «Listen 443», если они есть. Строка «rewrite ^ https://$server_name$request_uri? Permanent;» отвечает за принудительный редирект всех http запросов на https. Удалите или закомментируйте эту строку, если в подобном редиректе нет необходимости.

Подключаем виртуальный хост.
ln -s /etc/nginx/sites-available/ssl-example.com /etc/nginx/sites-enabled/ssl-example.com


Перезагружаем Apache и Nginx.
service apache2 restart
service nginx restart


По тому же принципу создаём виртуальный хост «ssl-example.net» и так далее.

Ложка дёгтя: Древние операционные системы, такие как Windows XP и прочие, а так же допотопные версии браузеров, не умеют работать с SNI. Ниже приведён список. При обращении к сайту с такого браузера, будет получен первый по списку сертификат, а не тот, который закреплён за сайтом. Проблема не актуальная, если виртуальные хосты располагаются на разных IP-адресах. В конфигурации следует указать IP-адрес. Пример:
listen   192.168.1.1:443;



Не поддерживается.
Клиентская часть.
WebDAV клиент в операционных системах Windows, включая Windows 7 и 8.
Internet Explorer всех версий на Windows XP.
Safari на Windows XP.
BlackBerry OS версии 7.1 и более ранние.
Windows Mobile вплоть до версии 6.5.
Браузер по умолчанию в Android 2.X (Исправлено в Honeycomb и Cream Sandwich).
Wget до версии 1.14.
Nokia Browser для Symbian (по крайней мере на Series60).
Opera Mobile для Symbian (по крайней мере на Series60).

Серверная часть:
IBM HTTP Server.

Библиотеки:
Клиентская часть Qt вплоть до версии 4.7.
Серверная часть Mozilla NSS.
Java до версии 1.7.
Python 2.X, 3.0. 3.1 (модули ssl, urllib[2] и httplib).


Поддерживается.
Баузеры:
Internet Explorer начиная с версии 7 на Windows Vista и новее.
Mozilla Forefox начиная с версии 2.0.
Opera 8.0 и новее (должен быть включен протокол TLS 1.1).
Opera Mobile для Android (по крайней мере бета-версии 10.1).
Все версии Google Chrome на Windows Vista и новее (на Windows XP начиная с версии 6).
Google Chrome начиная с версии 5.0.342.1 на OS X 10.5.7 и новее.
Safari 3.0 и новее на OS X, начиная с версии 10.5.6.
Safari 3.0 и новее на Windows Vista и более поздних ОС.
Konqueror, начиная с версии KDE 4.7.
MobileSafari на Apple OS начиная с версии 4.0.
Браузер по умолчанию на Honeycomb под Android начиная с версии 3.Х.
BlackBerry 10 и браузер по умолчанию в BlackBerry Tablet OS.
Windows Phone 7 и новее.
MicroB на MorphOS.

Серверы:
Apache 2.2.12 и более поздние при использовании mod_ssl или альтернативного mod_gnutls.
Microsoft Internet Information Server IIS 8 и новее.
Nginx c OpenSSL, собранный с поддержкой SNI.
Apache Traffic Server 3.2.0 и более поздние.
Radware Alteon ADC.
A10 Networks Thunder ADC 2.7.2 и более поздние.
Cherokee, если собран с поддержкой TLS.
Версии lighttpd 1.4.Х и 1.5.Х с патчами, или версия 1.4.24+ без патчей.
F5 Networks Local Traffic Manager версии 11.1 и более поздние.
Hiawatha (web server) 8.6 и новее.
LiteSpeed 4.1 и новее.
Pound 2.6 и новее.
Apache Tomcat на Java 7 и новее.
PageKite тоннелирующий обратный прокси.
Saetta Web Server под OpenSSL.
LBL®LoadBalancer 9.1 и новее.
Citrix NetScaler 9.2 и новее (улучшено в 9.3).
Radware Alteon ADC на AlteonOS 28.1 и новее.
HAProxy 1.5 и новее.
EVO Mail Server.
Lighttpd начиная с версии 1.4.24.

Библиотеки:
Mozilla NSS 3.11.1 (только клиентская часть).
OpenSSL 0.9.8f (должна быть скомпилирована с опцией «--enable-tlsext»).
OpenSSL 0.9.8j, скомпилированная по умолчанию.
OpenSSL 1.0.0, скомпилированная по умолчанию.
GnuTLS.
CyaSSL должна быть скомпилирована с опцией «--enable-sni» или «--enable-tlsx».
PolarSSL начиная с версии 1.2.0, скомпилированная по умолчанию.
ibcurl / cURL начиная с версии 7.18.1.
Python 3.2 (Модули ssl, urllib[2] и httplib).
Qt версии 4.8.
Oracle Java 7 JSSE.
Apache HttpComponents 4.3.2.
Wget 1.14.
HttpsURLConnection.
Частичная поддержка в Android 2.3 (Gingerbread).
Полная поддержка Android 3.0 (Honeycomb).
Pike 7.9.5 (модуль SSL).
MatrixSSL (клиентская и серверная части).
Stunnel (клиентская и серверная части).
Like Dislike




Tags: Nginx, Apache, Linux, Debian


 
  • Creative Commons Licence
  • Norton Safeweb
  • Website Uptime Monitoring By ServiceUptime.com