Создание самоподписанного SSL-сертификата
Поскольку самоподписанный сертификат не подписан ни одним из доверенных центров сертификации, включенных в браузеры, то его нельзя использовать для проверки подлинности сервера. |
Для создания самоподписанного SSL-сертификата необходимо выполнить следующие шаги:
-
Создать SSL-сертификат.
-
Настроить Nginx для использования самоподписанного SSL-сертификата.
-
Установить самоподписанный сертификат.
Создание 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. Для этого нужно выполнить следующее:
-
Указать расположение файлов ключа и SSL-сертификата.
-
Задать настройки SSL.
-
Настроить Nginx для поддержки SSL.
-
Настроить брандмауэр.
-
Сохранить изменения в конфигурации Nginx.
-
Проверить шифрование.
Задание расположения файлов ключа и 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-серверу Центрального Пульта в браузере будет отображаться предупреждение системы безопасности.
Для загрузки страницы необходимо нажать кнопку «Продолжить все равно» (или аналогичную, например: «Дополнительно» или «Продолжить»).
Если браузер не подключается к серверу, убедитесь, что брандмауэр не блокирует соединение. |
Установка самоподписанных сертификатов
Чтобы предупреждение системы безопасности не отображалось, нужно добавить самоподписанный сертификат в системное хранилище доверенных сертификатов или хранилище сертификатов браузера.
Для этого выполните указанные ниже действия.
Скопируйте сертификат в отдельную папку (например: /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