понедельник, 20 августа 2012 г.

Как привязать 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 законена.

Комментариев нет: