Как привязать 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. Скопируем его содержимое и идем на сайт 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 законена.

Комментарии