Как создать сертификат ECC в Nginx для Debian 8

Вступление

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

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

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

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

  • Одна свежая капля Debian 8.1

  • Пользователь sudo, не являющийся пользователем root, который можно настроить, выполнив шаги 2 и 3 из thisutorial

  • OpenSSL установлен и обновлен

Для тестирования вам понадобится одна из двух систем с установленным и обновленным OpenSSL:

  • Еще одна капля Linux

  • Локальная система на основе Linux (Mac, Ubuntu, Debian и т. Д.)

Шаг 1 - Установите Nginx

На этом этапе мы будем использовать встроенный установщик пакетов, называемый + apt-get. Это значительно упрощает управление и облегчает чистую установку.

В ссылке, указанной в предварительных требованиях, вы должны были обновить + apt-get + и установить пакет + sudo +, поскольку в отличие от других дистрибутивов Linux, Debian 8 не поставляется с установленным + sudo +.

Nginx - это вышеупомянутый HTTP-сервер, ориентированный на обработку больших нагрузок с низким использованием памяти. Чтобы установить его, запустите следующее:

sudo apt-get install nginx

Для получения информации о различиях между Nginx и Apache2, двумя наиболее популярными веб-серверами с открытым исходным кодом, см. Https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations[this article].

Шаг 2 - Создать каталог

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

sudo mkdir /etc/nginx/ssl

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

В этом разделе мы запросим новый сертификат и подпишем его.

Сначала создайте закрытый ключ ECC с помощью инструмента OpenSSL + ecparam +.

  • Флаг + out + направляет вывод в файл. Для этого урока мы сохраним ключ в + / etc / nginx / ssl / +.

  • Флаг + name + идентифицирует эллиптическую кривую + prime256v1 +.

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

Затем сгенерируйте запрос на подпись сертификата.

  • Флаг + key + указывает путь к нашему ключу, сгенерированному в предыдущей команде.

  • Флаг + out + указывает путь к нашему сгенерированному сертификату.

sudo openssl req -new -key /etc/nginx/ssl/ -out /etc/nginx/ssl/

Вызов этой команды приведет к серии подсказок.

  • * Common Name *: укажите IP-адрес вашего сервера или имя хоста.

  • * Испытательный пароль *: не укажите пароль.

  • Заполните все остальные поля по своему усмотрению. Нажмите + 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]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

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  -key /etc/nginx/ssl/ -in /etc/nginx/ssl/ -out /etc/nginx/ssl/

Установите права доступа к файлу для защиты вашего закрытого ключа и сертификата. Для получения дополнительной информации о трехзначном коде разрешений см. Учебное руководство по адресу https://www.digitalocean.com/community/tutorials/linux-permissions-basics-and-how-to-use-umask-on-a-vps. [Linux права доступа].

sudo chmod 600 /etc/nginx/ssl/*

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

Шаг 4 - Настройка сертификата

В этом разделе мы настроим виртуальные хосты Nginx с ключом и сертификатом. По сути, наш сервер начнет обслуживать HTTPS вместо HTTP-запросов.

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

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

В верхней части файла конфигурации вы найдете блок кода, похожий на следующий:

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

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

Следующие несколько изменений будут сделаны внутри блока + server +.

  1. Сначала закомментируйте первые две строки блока + server +, поставив перед строкой знак решетки:

и т.д. / Nginx / сайты с поддержкой / по умолчанию

server {
   # listen 80 default_server;
   # listen [::]:80 default_server;
  1. Затем раскомментируйте первую строку + listen под` + SSL Configuration`, удалив знак решетки. Сделайте отступ правильно, а также удалите + ssl default_server +.

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

   # SSL Configuration
   #
   listen 443;
   # listen [::]:443 ssl default_server;
   #
  1. Обновите корневой каталог, прямо под закомментированным блоком. оригинал читает + имя_сервера _; +. Измените его, включив в него ip вашего сервера, чтобы оно показывало + server_name +.

  2. После + имя_сервера + добавьте ваш ключ SSL и путь к сертификату.

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

       ssl on;
       ssl_certificate /etc/nginx/ssl/.pem;
       ssl_certificate_key /etc/nginx/ssl/.key;
  1. Наконец, добавьте настройки SSL.

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

       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;

Ваш конечный результат должен быть идентичен следующему.

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

# 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 ;

       ssl on;
      ssl_certificate /etc/nginx/ssl/.pem;
      ssl_certificate_key /etc/nginx/ssl/.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 - Тест Nginx с ECC

В этом разделе мы проверим сервер через командную строку. Еще раз, это может быть сделано либо (1) в вашей локальной системе на основе Linux, либо (2) в другой Droplet. Вы также можете запустить эту команду из того же окна оболочки, но вам может потребоваться более веское доказательство успеха.

Откройте соединение через порт HTTPS 443.

+ openssl s_client -connect: 443 +

Прокрутите до середины вывода после ключевого вывода, и вы должны найти следующее:

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

Конечно, числа являются переменными, но это успех. Поздравляем!

Нажмите + CTRL + C + для выхода.

Вы также можете посетить свой сайт в веб-браузере, используя HTTPS в URL (+ https: // example.com +). Ваш браузер предупредит вас, что сертификат самоподписан. Вы должны иметь возможность просмотреть сертификат и подтвердить, что данные соответствуют тому, что вы ввели в шаге 4.

Заключение

На этом наше руководство завершено, и у вас остается работающий сервер Nginx, настроенный с помощью сертификата ECC. Для получения дополнительной информации о работе с OpenSSL см. Https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs[the статья OpenSSL Essentials].

Related