Создание ECC-сертификата на Nginx в Debian 8

Данное руководство демонстрирует создание ECC-сертификата (Elliptic Curve Cryptography) для веб-сервера Nginx. В результате вы получите быстрый механизм шифрования для стадии производства.

Криптография с открытыми ключами основывается на предполагаемой высокой вычислительной сложности факторизации целых чисел. Шифрование ECC основывается на невозможности разрешения случайных эллиптических кривых в дискретные логарифмические функции (это называется «эллиптическая кривая дискретная проблема логарифма»; англ. –  elliptic curve discrete logarithm problem, или ECDLP). Коротко говоря, ЕСС предлагает более короткие ключи, обеспечивая аналогичный уровень безопасности, а это, в свою очередь, приводит к повышению производительности шифрования, применимого к цифровой подписи (как SSL).

Для создания ECC-сертификата необходим криптографический протокол на эллиптической кривой; существует несколько вариантов таких протоколов. Национальный институт стандартов и технологий (NIST) рекомендует использовать протоколы P-256 и P-384, также известные как prime256v1 и secp384r1. В данном руководстве используется простой и производительный протокол prime256v1.

Требования

Для выполнения руководства понадобится:

  • Свежий сервер Debian 8.1;
  • Не-рутовый пользователь с правами sudo (подробнее – здесь);
  • Предварительно установленный и обновлённый пакет OpenSSL.

Для тестирования может потребоваться еще одна система с OpenSSL. Это может быть:

  • Другой сервер Linux;
  • Основанная на Linux локальная система (Mac, Ubuntu, Debian и т.п.).

1: Установка Nginx

Сначала нужно установить веб-сервер. Для этого используйте встроенный менеджер пакетов apt-get, который способен сделать процесс установки и управление пакетами намного проще.

В ранее упомянутом руководстве можно найти инструкции по обновлению apt-get и установке пакета sudo.

Примечание: В отличие от остальных дистрибутивов Linux, Debian 8 поставляется без предустановленной утилиты sudo.

Чтобы установить веб-сервер Nginx (способный обрабатывать большие нагрузки при низком потреблении памяти), запустите:

sudo apt-get install nginx

2: Создание каталога

Теперь нужно создать отдельный каталог для хранения закрытого ключа:

sudo mkdir /etc/nginx/ssl

3: Создание самоподписанного ECC-сертификата

Итак, можно приступать к созданию и подписи сертификата.

Для создания закрытого ключа ECC  используется инструмент ecparam.

  • Флаг out запишет вывод в файл; в данном руководстве ключ хранится в /etc/nginx/ssl/nginx.key.
  • Флаг name задаёт протокол prime256v1.

sudo openssl ecparam -out /etc/nginx/ssl/nginx.key -name prime256v1 -genkey

После этого можно создать запрос на подпись сертификата.

  • Флаг key указывает путь к закрытому ключу.
  • Флаг out указывает путь к файлу сертификата.

sudo openssl req -new -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/csr.pem

После запуска этой команды на экране появится ряд вопросов. В поле Common Name укажите имя хоста или IP-адрес сервера. Поле Challenge Password не нужно заполнять. Остальные поля заполните на своё усмотрение. Чтобы принять настройки по умолчанию, нажмите ENTER.

You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:ECC Certificate Test
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []: webmaster@example.com
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:

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

  • x509 – это инструмент OpenSSL для создания сертификатов.
  • Флаг days устанавливает срок действия сертификата (в данном случае сертификат будет действителен в течение года).
  • Флаг in указывает на ранее сгенерированный запрос на сертификат.

sudo openssl req -x509 -nodes -days 365 -key /etc/nginx/ssl/nginx.key -in /etc/nginx/ssl/csr.pem -out /etc/nginx/ssl/nginx.pem

Установите права на файл, чтобы защитить закрытый ключ и сертификат.

sudo chmod 600 /etc/nginx/ssl/*

Примечание: Подробнее о правах Linux можно прочесть в этом руководстве.

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

4: Настройка сертификата

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

Откройте конфигурационный файл сервера при помощи текстового редактора:

sudo nano /etc/nginx/sites-enabled/default

В начале файла найдите следующий блок кода:

...
# Default server configuration
#
server {
...
}

В блок server нужно внести следующие изменения:

  • Закомментировать первые две строки блока server при помощи символа решётки:

# listen 80 default_server;
# listen [::]:80 default_server;

  • Раскомментировать строку listen под строкой SSL Configuration, удалив символ решётки. Кроме этого, нужно удалить ssl default_server.

# SSL Configuration
#
listen 443;
# listen [::]:443 ssl default_server;
#

  • Указать новый root-каталог (сразу под закомментированным блоком).
  • В server_name _; нужно указать ip сервера:

server_name your_server_ip

  • После строки server_name укажите пути к ключу и сертификату.

ssl on;
ssl_certificate /etc/nginx/ssl/nginx.pem;
ssl_certificate_key /etc/nginx/ssl/nginx.key;

  • Добавьте настройки SSL:

ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL;
ssl_prefer_server_ciphers on;

В результате файл должен иметь такой вид:

# Default server configuration
#
server {
# listen 80 default_server;
# listen [::]:80 default_server;
# SSL configuration
#
listen 443;
# listen [::]:443 ssl default_server;
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name your_server_ip;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.pem;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL;
ssl_prefer_server_ciphers on;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

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

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

sudo service nginx restart

5: Тестирование ECC-сертификата

Осталось только убедиться, что веб-сервер поддерживает ECC-сертификат. Это можно сделать при помощи командной строки:

  • В локальной системе Linux,
  • Или на другом сервере.

В целом, эту команду можно запустить в текущей оболочке, но такая проверка не очень надёжна.

Итак, откройте HTTPS-соединение на порт 443.

openssl s_client -connect your_server_ip:443

В середине вывода найдите следующий фрагмент:

SSL handshake has read 3999 bytes and written 444 bytes
---
...
SSL-Session:
...

Конечно, числа могут отличаться, но эта строка говорит о том, что сертификат успешно установлен.

Чтобы выйти, нажмите CTRL+C.

Также можно посетить сайт в браузере, используя в URL-адресе HTTPS (например, https://example.com). Браузер выведет предупреждение о том, что сертификату нельзя доверять (это нормальная реакция, поскольку он не заверен центром сертификации). Просмотрите сертификат и убедитесь, что все данные отображены верно.

Теперь сервер Nginx защищён при помощи ECC-сертификата.

Tags: , , , ,

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