[[Настройка ssl (https) в nginx]]

Настройка ssl (https) в nginx

Чтобы защитить передаваемый трафик между сервером и клиентом можно использоваться механизм SSL шифрования.

Так как nginx часто выступает в роли фронтенда перед апачем, то лучше возложить шифрование на него.

Использование массового самоподписанного сертификата

Настроим использование одного самоподписанного сертификата для нескольких сайтов.

Создадим общий файл конфигурации SSL:

/etc/nginx/ssl.conf

# Подключение самоподписанного сертификата
# генерация сертификата:
# openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key

ssl			on;
ssl_protocols		SSLv3 TLSv1;
ssl_certificate		/etc/nginx/ssl/cert.pem;
ssl_certificate_key	/etc/nginx/ssl/cert.key;

Создадим папку где будем хранить сертификаты:

mkdir /etc/nginx/ssl

Для большей безопасности ограничиваем доступ к сертификатам:

chown nginx:nginx /etc/nginx/ssl
chmod 700 /etc/nginx/ssl

Перейдем в эту папку и сгенерируем сертификат:

cd /etc/nginx/ssl
openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key

При генерации вас попросят указать некоторые данные, так как мы создаём сертификат для себя то заполнять их не обязательно.

Теперь для включения шифрования нужных сайтов будум использовать следующий шаблон:

в конфигурации сайтов nginx:

server {
        listen          *:443;       # порт https
        server_name     my.site.com; # ваш сайт

        include	/etc/nginx/ssl.conf; # подключение конфигурации ssl

        ...
}

Пример с принудительным перенаправлением с http на https:

в конфигурации сайтов nginx:

server {
        listen          *:443;       # порт https
        listen		*:80;        # порт http
        server_name     my.site.com; # ваш сайт

        include	/etc/nginx/ssl.conf; # подключение конфигурации ssl

        if ( $scheme = "http" ) {
	      rewrite ^/(.*)$	https://$host/$1 permanent;
        }

        ...
}

После настройки необходимо перезагрузить nginx:

/etc/init.d/nginx reload

Всё готово, для доступа к сайту следует использовать https протокол - https://my.site.com

Так как сертификат самоподписанный браузер попросит подтвердить исключение на его использование.

Дополнительные опции создания SSL-сертификата

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

openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key

запрашивает некоторую информацию для создания сертификата, заполнение которой можно пропустить.

Но если интересно вот описание параметров:

Значение Описание Обязательный параметр?
С Двухсимвольный код страны (Country) нет
ST Название региона/области/края/республики/… (State Name) нет
L Название города/поселка/… (Locality Name) нет
O Название организации (Organization Name) нет
OU Название отдела (Organization Unit) нет
CN Имя сертификата, при создании серверных сертификатов используется доменное имя сайта (Common Name) да
emailAddress почтовый адрес (E-mail address) нет

Чтобы не вводить эти параметры интерактивное можно использовать опцию -subj:

openssl req -new -x509 -days 9999 -nodes -subj /C=RU/O=My\ site/CN=my.site.com/emailAddress=admin@site.com -out cert.pem -keyout cert.key

Обсуждение

Konstantin vzOne Enchant, 2010/04/19 14:37

http://www.opennet.ru/base/sec/ssl_sertifacition.txt.html

Дмитрий, 2010/07/13 23:46

Очень признателен вам за статью! Помогло! =)

Илья, 2011/04/25 10:16

Я конечно не разбираюсь в этом, но уж помочь разобраться как составить защищенное соединение https для сайта можно было бы и поподробнее

Konstantin vzOne Enchant, 2011/04/25 15:39

Куда уж подробнее? :-)))

vit, 2011/05/11 13:54

Спасибо, просто и удобно. Плюс использовал server_name *.* ;

Dmitry Paskal, 2011/12/07 15:55

if для https - глупость. Нужно создать отдельный сервер:

server {
        listen 80;
        listen [::]:80;
        server_name .domain.com;
        rewrite     ^ https://domain.com$request_uri? last;
}
Пожалуйста, поправьте, это важно. Вместо last можно использовать permanent или нечто другое, вот все флаги:
    last — завершает обработку текущего набора директив ngx_http_rewrite_module, после чего ищется соответствие URI и location;
    break — завершает обработку текущего набора директив ngx_http_rewrite_module;
    redirect — возвращает временный редирект с кодом 302; используется, если заменяющая строка не начинается с "http://";
    permanent — возвращает постоянный редирект с кодом 301. 

Ваш комментарий. вики-синтаксис разрешён:
IYFML
 
howto/nginx_ssl.txt · Последние изменения: 2010/03/17 12:09 (внешнее изменение)
Gentoo Linux Driven by DokuWiki Recent changes RSS feed
Продажа окон, окна ПВХ с доставкой и монтажом.