В данной заметке я расскажу как быстро привязать 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. Скопируем его содержимое и идем на сайт http://www.freessl.su/. Там заполняем поля ФИО, Телефон, email и вставляем содержимое файла secure.website.ru.csr в поле CSR. Нажимаем далее, выбираем подходящий контактный email.
После этого на почтовый ящик от Comodo придет письмо с просьбой подтвердить создание ssl сертификата. В письме будет указан код подтверждения. Перейдите по ссылке в письме и подтвердите.
Через некоторое время вам придет файл с сертификатом и файл с промежуточными сертификатами. Скопируйте их содержимое в /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 законена.
Итак, для начала определимся что у нас есть. А есть у нас один 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. Скопируем его содержимое и идем на сайт http://www.freessl.su/. Там заполняем поля ФИО, Телефон, email и вставляем содержимое файла secure.website.ru.csr в поле CSR. Нажимаем далее, выбираем подходящий контактный email.
После этого на почтовый ящик от Comodo придет письмо с просьбой подтвердить создание ssl сертификата. В письме будет указан код подтверждения. Перейдите по ссылке в письме и подтвердите.
Через некоторое время вам придет файл с сертификатом и файл с промежуточными сертификатами. Скопируйте их содержимое в /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 законена.
Комментариев нет:
Отправить комментарий