HOWTO: SSL и NGINX

В данной заметке я расскажу как быстро привязать ssl сертификат к nginx. Испытания мы проведем тестовом сервере с тестовым сертификатом, который запросим у Comodo.

Итак, для начала определимся что у нас есть. А есть у нас один nginx сервер который смотрит в Интернет. И, для простоты, один внутренний (с ip 10.10.10.10) для которого и будет создаваться стандартное и ssl подключение. Конечно, серверов может быть сколько угодно. Но мы с вами сейчас не будем усложнять.

Для начала нам необходимо создать CSR-запрос на сертификат. Бесплатно можно его сделать либо напрямую у Comodo, либо через сайт http://www.freessl.su/. Мы будет делать через http://www.freessl.su/.

Конфигурационные файлы от nginx у меня лежат в каталоге /etc/nginx. Создаем там подкаталог ssl и переходим в него.

 mkdir /etc/nginx/ssl
 cd /etc/nginx/ssl

Далее необходимо создать CSR запрос. Для этого сначала создадим файл приватного ключа следующей командой:

openssl genrsa -des3 -out secure.website.ru.key 2048

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

openssl genrsa -out secure.website.ru.key 2048

Далее создадим файл запроса на генерацию сертификата. Для этого пишем команду и заполняем необходимые поля:

openssl req -new -key secure.website.ru.key -out secure.website.ru.csr

После этого будет сгенерирован файл /etc/nginx/ssl/secure.website.ru.csr. Скопируем его содержимое и идем на сайт www.freessl.su. Там заполняем поля ФИО, Телефон, email и вставляем содержимое файла secure.website.ru.csr в поле CSR. Нажимаем далее, выбираем подходящий контактный email. После этого на почтовый ящик придет письмо с просьбой подтвердить создание ssl сертификата. В письме будет указан код подтверждения. Перейдите по ссылке в письме и введите код.

Через некоторое время вам придет архив с сертификатом и файлом с промежуточными сертификатами. Скопируйте содержимое secure_website_ru.ca-bundle в /etc/nginx/ssl/secure.website.ru.crt.

cat secure_website_ru.crt >> /etc/nginx/ssl/secure.website.ru.crt
cat secure_website_ru.ca_bundle >> /etc/nginx/ssl/secure.website.ru.crt

На этом формирование сертификата закончено.

Переходим к настройке nginx. Для нашего случая конфигурация /etc/nginx/nginx.conf будет выглядеть следующим образом:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
 pid /var/run/nginx.pid;
 events {
 worker_connections 2048;
 }
 http {
 upstream www {
 server 10.10.10.10 weight=1 max_fails=3 fail_timeout=120;
 }
include /etc/nginx/mime.types;
 default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#Секция для стандартного подключение по 80 порту
 server {
 listen 80;
 server_name secure.website.ru;
 reset_timedout_connection on;
 location / {
 proxy_pass http://www/;
 proxy_next_upstream error timeout invalid_header http_500 http_503;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_redirect off;
 proxy_connect_timeout 100;
 }
 }
# Секция для подключения по ssl
 server {
 listen 443 ssl;
 server_name secure.website.ru;
access_log logs/ssl-access.log;
 error_log logs/ssl-error.log;
ssl_certificate ssl/secure.website.ru.crt;
 ssl_certificate_key ssl/secure.website.ru.key;
 ssl_verify_depth 3;
keepalive_timeout 60;
 location / {
 proxy_pass http://www/;
 proxy_next_upstream error timeout invalid_header http_500 http_5
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto https;
 proxy_redirect off;
 }
 }
 }
Сохраняем и перезапускаем nginx.
# service nginx reload
Вдаваться в детали настроек я не хочу. Про них очень хорошо написано в официальной документации nginx.
Единственное что хотелось бы подчеркнуть, что если вы хотите на 1 сервер повесить несколько разных ssl сертификатов на порт 443, то просто добавить такую конфигурацию не получится:
server {
 listen 443;
 server_name www.example.com;
 ssl on;
 ssl_certificate www.example.com.crt;
 ...
 }
server {
 listen 443;
 server_name www.example.org;
 ssl on;
 ssl_certificate www.example.org.crt;
 ...
 }

В такой конфигурации браузер получит сертификат первого сервера, т.е. www.example.com, независимо от запрашиваемого имени сервера. Это связано с поведением протокола SSL. SSL-соединение устанавливается до того, как браузер посылает HTTP-запрос, и nginx не знает имени запрашиваемого сервера. Следовательно, он лишь может предложить сертификат сервера по умолчанию. Решение данного вопроса вы можете найти по ссылке.

На этом базовая настройка nginx законена.

Оставить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *