[[SSL (https) в Nginx]]

SSL (https) в Nginx

nginx/1.4.6

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

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

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

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

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

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

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

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

Настройка

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

server {
    listen          *:80;
    listen          *:443 ssl;
    server_name     my.site.com;

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2; # SSLv3 исключить CVE-2014-3566
    ssl_certificate	/etc/nginx/ssl/cert.pem;
    ssl_certificate_key	/etc/nginx/ssl/cert.key;

    ...
}

таким образом можно работать как по HTTP так и HTTPS

Пример с принудительным использованием HTTPS

server {
    listen          *:80;
    server_name     my.site.com;    
    rewrite ^ https://$host$request_uri? permanent;
}

server {
    listen          *:443 ssl;
    server_name     my.site.com;

    ssl			on;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2; # SSLv3 исключить CVE-2014-3566
    ssl_certificate	/etc/nginx/ssl/cert.pem;
    ssl_certificate_key	/etc/nginx/ssl/cert.key;

    ...
}

После настройки необходимо перезагрузить 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 *.* ;

NGinix, 2013/08/14 11:37

Можете подсказать как сгенирировать сертификат на Windows?

aprogrammer, 2015/01/13 23:13

Спасибо за статью. Правда, еще можно немного добавить команд по генерации csr,key и crt в разных ситуациях (на лету без вопросом, с готовым ключом, с ключом без пароля, и тп.), как пишут здесь - http://sysadm.pp.ua/internet/pound-apache-nginx-ssl-setup.html

Eddie, 2015/04/29 09:35

Не взлетело. В конфиге джумлы ssl включил. Домен третьего уровня. При генерации серта заполнил все поля. Только звездочки не ставил перед портами 'listen 80;' - для конкретного домена.

Ваш комментарий. Вики-синтаксис разрешён:
87 -0 = ?
 
howto/nginx_ssl.txt · Последние изменения: 2015/06/02 15:48 — lexa
Gentoo Linux Driven by DokuWiki
Что такое бесплатный ssl сертификат.