Создание SSL-сертификата на Nginx в Ubuntu 14.04

Published by 2 Comments

TLS  (или Transport Layer Security, безопасность транспортного уровня) и его предшественник SSL (Secure Socket Layers, уровень защищённых сокетов) – это криптографические протоколы, которые используются для защиты передачи данных в Интернете.

Эта технология позволяет защитить обмен данными между сервером и клиентом и предотвратить перехват или несанкционированный доступ к информации. Кроме того, эти протоколы предоставляют систему сертификатов, которая помогает пользователям проверить подлинность сайтов, на которые они заходят.

Данное руководство продемонстрирует, как создать самоподписанный SSL-сертификат для веб-сервера Nginx на Ubuntu 14.04. Имейте в виду: самостоятельно подписанный сертификат не сможет подтвердить подлинности сервера, так как он не подписан проверенным центром сертификации (ЦС); тем не менее, такой сертификат позволит шифровать взаимодействие с веб-клиентами.

Требования

Чтобы следовать данному руководству, нужно создать нового пользователя с расширенными привилегиями sudo (root использовать не рекомендуется). Всю необходимую информацию по этому вопросу можно найти в статье «Начальная настройка сервера Ubuntu 14.04».

Кроме того, нужно предварительно установить Nginx. Чтобы установить всю группу программ LEMP (Linux, Nginx, MySQL, PHP), читайте руководство «Установка LEMP stack на Ubuntu 14.04»

Чтобы установить только Nginx, введите:

sudo apt-get update
sudo apt-get install nginx

1: Создание SSL-сертификата

Для начала нужно создать каталог для хранения информации SSL в конфигурационном каталоге Nginx:

sudo mkdir /etc/nginx/ssl

Теперь на сервере есть отдельное место для хранения файлов SSL; создайте ключ и сертификат при помощи следующих команд:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

При этом появится ряд вопросов. Но прежде чем продолжить, нужно разобрать вышеприведенные команды:

  • openssl: базовый инструмент командной строки для создания и управления сертификатами, ключами и другими файлами OpenSSL.
  • req: эта подкоманда указывает, что на данном этапе нужно использовать запрос на подпись сертификата X.509 (CSR). X.509 – это стандарт инфраструктуры открытого ключа, которого придерживаются SSL и TLS при управлении ключами и сертификатами. То есть, данная команда позволяет создать новый сертификат X.509.
  • -x509: данная опция вносит поправку в предыдущую субкоманду, сообщая утилите о том, что вместо запроса на подписание сертификата необходимо создать самоподписанный сертификат.
  • -nodes: говорит OpenSSL пропустить опцию защиты сертификата парольной фразой. Нужно, чтобы при запуске сервер Nginx имел возможность читать файл без вмешательства пользователя. Установив пароль, придется вводить его после каждой перезагрузки.
  • -days 365: эта опция устанавливает срок действия сертификата (как видите, в данном случае сертификат действителен в течение года).
  • -newkey rsa:2048: эта опция позволяет одновременно создать новый сертификат и новый ключ. Поскольку ключ, необходимый для подписания сертификата, не был создан ранее, нужно создать его вместе с сертификатом. Данная опция создаст ключ RSA на 2048 бит.
  • -keyout: эта опция сообщает OpenSSL, куда поместить сгенерированный файл ключа.
  • -out: сообщает OpenSSL, куда поместить созданный сертификат.

Как уже было сказано, все эти опции сгенерируют и ключ, и сертификат. Но сначала нужно будет заполнить появившиеся поля информацией о сервере, которая должна отображаться в сертификате.

Итак, заполните эти поля соответствующими данными. Самой важной строкой является Common Name (введите полное доменное имя  сервера (FQDN) или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера. В целом эти поля выглядят примерно так:

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:admin@your_domain.com

Файлы ключа и сертификата будут помещены в каталог /etc/nginx/ssl.

2: Настройка Nginx для поддержки SSL

Итак, на данном этапе ключ и сертификат уже созданы и хранятся в конфигурационном каталоге Nginx. Теперь нужно просто отредактировать настройки (а точнее, файл блока server) Nginx.

Веб-серверы Nginx версии 0.7.14 и выше (Ubuntu 14.04 поставляется с 1.4.6) позволяют активировать SSL в том же блоке server, что и обычный HTTP-трафик.

Блок server имеет примерно такой вид:

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}

Чтобы включить SSL с помощью такого блока server (и при этом оставить обычные HTTP-соединения), нужно просто внести в него следующие строки:

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
listen 443 ssl;
root /usr/share/nginx/html;
index index.html index.htm;
server_name your_domain.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ =404;
}
}

Внеся все необходимые изменения, сохраните и закройте файл.

Теперь нужно перезапустить Nginx, чтобы веб-сервер начал использовать новые настройки:

sudo service nginx restart

После этого сервер сможет отвечать на запросы HTTP и HTTPS (SSL).

3: Тестирование настроек

Теперь сайт должен использовать протокол SSL; нужно убедиться, что все работает должным образом, выполнив проверку настроек.

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

http://домен_или_IP_сервера

Браузер должен открыть соответствующий сайт. Если так и случилось, значит, сервер по-прежнему обрабатывает запросы HTTP.

Теперь нужно проверить, может ли сервер работать через SSL. Для этого используйте предыдущий формат, заменив протокол http протоколом https:

https://домен_или_IP_сервера

Скорее всего, веб-браузер отобразит предупреждение «The site’s security is not trusted». Так браузер сообщает, что он не может проверить подлинность сервера, к которому нужно подключиться, поскольку сайт не заверен центром сертификации, которому браузер может доверять. Поскольку созданный ранее сертификат является самоподписанным, это ожидаемая реакция.

Чтобы продолжить, нажмите кнопки Proceed anyway, Continue (или подобную доступную кнопку). После этого браузер откроет нужный сайт.

В адресной строке браузера могут быть зачеркнуты  часть «https» или значок «lock» (знак замка). Если щелкнуть по значку замка, можно получить более подробную информацию о подключении.

Как видите, на данном этапе проблема состоит только в том, что браузер не может проверить подлинность сервера, потому что он не был подписан надежным с точки зрения браузера центром сертификации. Тем не менее, самоподписанный сертификат шифрует соединение, что и было целью данного руководства.

Итоги

Теперь сервер Nginx может обрабатывать запросы HTTP и SSL, что защитит взаимодействие сервера с клиентами и предотвратит перехват трафика неавторизованными пользователями.

Конечно, при разработке общественного сайта рекомендуется подписать SSL-сертификат в надежном центре сертификации, что позволит избежать появления отпугивающих предупреждений.

Tags: , , , , , , , ,

Комментарии (2)

  • Павел:

    Спасибо! Полезная статья. Только у меня почему-то не работает. При подключении к серверу по https никакого предупреждения о непроверенном сертификате нет. Да и вообще запрос выдает connection timeout. В чем может быть проблема?
    Система CentOS 7, SELinux отключен, в фаерволе открыт 80 и 443 порты, на инет-шлюзе фаервол отключен и настроен port forwarding для 80 и 443 портов на сервер centos, версия nginx 1.6.2.
    Вот конфиг nginx:

    server {
    listen 80;
    server_name site.org http://www.site.org;
    rewrite ^(.*) https://$server_name$1 permanent;
    }
    server {
    listen 443 ssl;
    server_name site.org http://www.site.org;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_pass http://192.168.1.250;
    }
    }

Добавить комментарий

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


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>