Создание самодписанного SSL сертификата для Nginx в Ubuntu 16.04

Введение

TLS (transport layer security) и его предшественник SSL (secure sockets layer) - сетевые протоколы, в которые упаковывается обычный трафик с применением шифрования.

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

В этом руководстве мы покажем как установить самоподписанный сертификат в веб-сервер Nginx на сервере с Ubuntu 16.04.

Примечание: Самодподписанные сертификаты позволяют шифровать соединение между сервером и клиентами. Однако, из-за отсутствия у такого сертификата подписи удостоверяющего центра, поддерживаемого браузерами, пользователи не могут использовать его для автоматической проверки подлинности.

Самодподисанный сертификат может применяться, если у вас нет доменного имени, ассоциированного с вашим сервером, для шифрования трафика между приложениями, которые не общаются с конечными пользователями. Если же у вас есть доменное имя, то во многих случая лучше использовать заверенный удостоверяющим центром сертификат. Для получения и установки бесплатного доверенного сертификата вы можете воспользоваться проектом Let's Enctrypt.

Шаг 1. Создание сертификата

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

Мы можем создать ключ и самоподписанный сертификат с помощью одной из команд OpenSSL:

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

Давайте подробно рассмотрим что делает эта команда:

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

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

Заполните поле соответствующим образом. Наиболее важной является строка Common Name (e.g. server FQDN or YOUR name). Здесь вам необходимо указать доменное имя, ассоциированное с сервером или, что более вероятно, публично доступный IP адрес сервера.

Полный список запросов будет выглядеть примерно так:

Output
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IT Services, Ltd.
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:SERVER_IP
Email Address []:admin@example.com

Оба созданных файла будут помещены в соответствующие поддиректории в директории /etc/ssl.

При использовании OpenSSL нам также следует создать стойкую группу Диффи-Хеллмана, которая используется при согласовании ключей с клиентами (Perfect Forward Secrecy).

Мы можем это сделать следующей командой:

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Этот процесс может занять несколько минут, но в результате вы получите стойку DH группу в /etc/ssl/certs/dhparam.pem, которую сможете использовать в конфигурации.

Шаг 2. Настройка использования SSL в Nginx

Мы создали файлы с нашими ключом и сертификатом в директории /etc/ssl. Теперь нам нужно модифицировать конфигурацию Nginx для их применения.

Мы сделаем несколько изменений в настройках:

  1. Добавим в конфигурацию фрагмент с указанием путей к файлам с нашими SSL ключом и сертификатом.
  2. Добавим в конфигурации фрагмент с указанием настроек стойкого шифрования SSL, которые в будущем можно будет использовать с любым сертификатом.
  3. Модифицируем блоки server в Nginx для обработки SSL запросов с применением фрагментов конфигурации из двух предыдущих пунктов.

Этот метод настройки Nginx позволит нам сохранить блоки server в аккуратном виде и вынести общие участки конфигурации в модули для повторного использования.

Создание фрагмента конфигурации с указанием на пути к ключу и сертификату SSL

Сперва, давайте создадим новый фрагмент конфигурации Nginx в директории /etc/nginx/snippets.

Четко обозначим задачу этого файла, назвав его self-signed.conf:

$ sudo nano /etc/nginx/snippets/self-signed.conf

Внутри этого файла нам нужно всего лишь прописать в директиве ssl_certificate путь к файлу с нашим сертификатом, а в ssl_certificate_key - к файлу с ассоциированным с ним ключом. В нашем случае это будет выглядеть так:

ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;

После добавления этих строк сохраните и закройте файл.

Создание фрагмента конфигурации с настройкой стойкого шифрования

Далее, мы создадим другой фрагмент в котором опишем настройки SSL. Это обеспечит использование в Nginx криптостойкого шифрования с применением дополнительных мер по защите нашего сервера.

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

$ sudo nano /etc/nginx/snippets/ssl-params.conf

Для безопасной настройки Nginx возпользуемся рекомендациями с сайта https://cipherli.st/, посвященного простой настройке безопасности в популярном программном обеспечении. Содержимое файла будет выглядеть так:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

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

Сохраните и закройте файл по готовности.

Модификация конфигурации Nginx для использования SSL

Теперь, когда у нас есть готовые фрагменты конфигурации, мы включим использование SSL в Nginx.

В этой статье мы предполагаем, что вы используете стандартный файл настройки блока server из директории /etc/nginx/sites-available. Если используете другой файл, то подставьте его имя в последующие команды.

Откроем файл для настройки:

$ sudo nano /etc/nginx/sites-available/default

Сперва мы сделаем редирект для запросов, которые не используют SSL. Для этого выделим соответствующие настройки в отдельный блок server:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 301 https://$server_name$request_uri;
}

Далее мы изменим содержание оставшегося блока так, чтобы он работал только на порту 443. В нем мы также включим поддержку HTTP/2. После этого, подключим два ранее созданных фрагмента конфигурации:

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;
    ....
}

Сохраните и закройте файл.

Шаг 3. Применение настроек

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

$ sudo nginx -t

Если все правильно, то перезапустим сервер:

$ sudo systemctl restart nginx
Статьи и заметки
ЛИЧНЫЙ КАБИНЕТ
На вашу почту отправлено сообщение с кодом подтверждения. Введите его для завершения регистрации.
ВЫПОЛНИТЬ