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

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

Для создания самоподписанного SSL-сертификата необходимо выполнить следующие шаги:

  1. Создать SSL-сертификат.

  2. Настроить Nginx для использования самоподписанного SSL-сертификата.

  3. Установить самоподписанный сертификат.

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

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

Для создания файлов сертификата нужно использовать следующую команду:

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
При создании SSL-сертификата также создается файл ключа, который позволяет серверу безопасно обрабатывать шифрованные данные.

где:

  • openssl: это инструмент командной строки, предназначенный для создания сертификатов, ключей и других файлов OpenSSL и управления ими;

  • req -x509: задает управление запросами на подписание сертификатов X.509 (CSR);

  • -nodes: предписывает пропустить опцию защиты сертификата кодовой фразой после перезапуска сервера;

  • -days 365: устанавливает период действия сертификата сроком на 1 год. Многие браузеры отклоняют любые сертификаты, срок действия которых превышает этот период;

  • -newkey rsa:2048: указывает, что требуется сгенерировать новый сертификат и новый ключ одновременно; часть rsa:2048 предписывает создать ключ RSA длиной 2048 бит;

  • -keyout: указывает, где разместить генерируемый файл закрытого ключа;

  • -out: указывает, где разместить создаваемый сертификат.

После ввода команды отображается список диалогов, в которых нужно ввести необходимую информацию.

В строке Common Name нужно ввести имя хоста или публичный IP-адрес, который будет использоваться для доступа к серверу. Указываемое значение должно совпадать с данными, вводимыми в адресную строку браузера.

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

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:admin@example.com

Созданные файлы сохраняются в соответствующие подкаталоги в каталоге /etc/ssl. Подкаталоги задаются с помощью параметров -keyout и -out.

Чтобы создать ключ для поддержки PFS, используйте следующую команду:

$ sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Этот процесс занимает несколько минут. Созданный ключ будет помещен в каталог /etc/nginx.

Настройка Nginx для использования самоподписанного SSL-сертификата

После создания ключа и сертификата нужно отредактировать настройки сервера Nginx. Для этого нужно выполнить следующее:

  1. Указать расположение файлов ключа и SSL-сертификата.

  2. Задать настройки SSL.

  3. Настроить Nginx для поддержки SSL.

  4. Настроить брандмауэр.

  5. Сохранить изменения в конфигурации Nginx.

  6. Проверить шифрование.

Задание расположения файлов ключа и SSL-сертификата

Создайте новый сниппет Nginx в каталоге /etc/nginx/snippets:

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

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

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

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

Задание настроек SSL

Создайте другой сниппет конфигурации Nginx, в котором будут храниться настройки SSL, например:

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

Скопируйте следующий код в файл ssl-params.conf:

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

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

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

Создайте резервную копию текущего файла конфигурации Nginx, например:

$ sudo cp /etc/nginx/sites/your_domain /etc/nginx/sites/your_domain.bak

Откройте созданный файл, чтобы внести в него изменения, например:

$ sudo nano /etc/nginx/sites/your_domain

В файле нужно обновить директивы listen и включить сниппеты SSL. Этот блок нужно настроить для поддержки трафика SSL по порту 443, а затем создать новый блок server для обработки трафика на порту 80 и автоматической переадресации трафика на порт 443.

В текущем файле обновите директивы listen для поддержки порта 443 и ssl, а затем включите два файла сниппетов: self-signed.conf и ssl-params.conf.

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

root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

  server_name your_domain.com www.your_domain.com;

  location / {
                try_files $uri $uri/ =404;
        }
}

Добавьте второй блок server (после закрывающей фигурной скобки (}) первого блока):

server {
    listen 80;
    listen [::]:80;

    server_name your_domain.com www.your_domain.com;

    return 302 https://$server_name$request_uri;
}

Это позволит прослушивать порт 80 и выполнять перенаправление на HTTPS.

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

Настройка брандмауэра

Если вы используете брандмауэр (например, ufw), то нужно изменить настройки, чтобы разрешить SSL-трафик.

При установке Nginx регистрирует в ufw несколько профилей. Посмотреть доступные профили можно с помощью следующей команды:

$ sudo ufw app list

Должен отобразиться следующий вывод:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Чтобы проверить текущие настройки, используйте следующую команду:

$ sudo ufw status

Скорее всего, веб-серверу разрешен только HTTP-трафик. Должен отобразиться вывод, как показано ниже:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Чтобы разблокировать HTTPS-трафик, можно обновить разрешения для профиля Nginx Full, после чего удалить профиль Nginx HTTP:

$ sudo ufw allow 'Nginx Full'
$ sudo ufw delete allow 'Nginx HTTP'

Выполните команду sudo ufw status и проверьте, что настройка брандмауэра была выполнена успешно:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Сохранение изменений в конфигурации Nginx

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

Выполните следующую команду, чтобы убедиться, что в файлах нет синтаксических ошибок:

$ sudo nginx -t

Если ошибки отсутствуют, должен отобразиться следующий вывод:

nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

После этого можно перезапустить Nginx для сохранения изменений:

$ sudo systemctl restart nginx

Проверка шифрования

Подключитесь к web-серверу Центрального Пульта, добавив в адресной строке браузера префикс https://.

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

image

Для загрузки страницы необходимо нажать кнопку «Продолжить все равно» (или аналогичную, например: «Дополнительно» или «Продолжить»).

Если браузер не подключается к серверу, убедитесь, что брандмауэр не блокирует соединение.

Установка самоподписанных сертификатов

Чтобы предупреждение системы безопасности не отображалось, нужно добавить самоподписанный сертификат в системное хранилище доверенных сертификатов или хранилище сертификатов браузера.

Для этого выполните указанные ниже действия.

Скопируйте сертификат в отдельную папку (например: /usr/local/share/ca-certificates):

$ cp ./ca.crt /usr/local/share/ca-certificates/losstca.crt

После этого необходимо выполнить следующую команду:

$ sudo update-ca-certificates

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

$ curl -I https://localhost
Некоторые браузеры (например, Firefox и Google Chrome) имеют собственные хранилища сертификатов и не используют хранилище системы. Поэтому в каждый такой браузер нужно импортировать самоподписанный сертификат.

Чтобы импортировать самоподписанный сертификат в хранилище сертификатов браузера, выполните указанные ниже действия.

Импорт сертификата с помощью графического интерфейса в Google Chrome

  • В настройках браузера нужно перейти в раздел Конфиденциальность и безопасность → Безопасность → Управление сертификатами устройства.

  • В открывшемся окне нужно открыть вкладку Доверенные корневые центры сертификации.

  • Нажать кнопку Импорт и выбрать файл корневого сертификата.

  • Указать желаемые параметры доверия.

Сертификат будет импортирован в хранилище сертификатов браузера.

Импорт сертификата в терминале с помощью утилиты certutil

Для работы с сертификатами требуется пакет libnss3-tools. Для установки пакета используйте следующую команду:

$ sudo apt install libnss3-tools

База данных сертификатов Google Chrome находится в папке ~/.pki/nssdb. Чтобы посмотреть доступные сертификаты, можно использовать следующую команду:

$ certutil -d ~/.pki/nssdb -L

Синтаксис команды для добавления сертификата следующий:

$ certutil -d путь/к/базе/данных -A -t "настройки_доверия" -n "имя" -i "/путь/к/файлу"

Существует три группы атрибутов доверия:

  • для SSL;

  • для Email;

  • для программного обеспечения и других объектов.

Каждая из групп может содержать следующие атрибуты:

  • p — валидный пир;

  • P — доверенный пир;

  • c — валидный центр сертификации;

  • C — доверенный центр сертификации;

  • T — доверенный центр сертификации для авторизации клиентов.

Для SSL-сертификатов будет достаточно такой последовательности "TC,,". Полная команда для импорта ca.crt будет выглядеть следующим образом:

$ certutil -d sql:~/.pki/nssdb -A -t "TC,," -n "Losst CA" -i ./ca.crt

Для просмотра списка сертификатов можно использовать следующую команду:

$ certutil -d sql:~/.pki/nssdb -L