02.12.2019 16:50 03.02.2020 15:20

Добавление доверенного самоподписанного SSL-сертификата в Nginx на Debian/Ubuntu

В этой статье я объясню, как добавить доверенный самоподписанный (самозаверяющий) SSL-сертификат в Nginx сервер на операционной системе Debian/Ubuntu. Я всегда использую HTTPS протокол для локальной среды разработки. Но меня всегда раздражало, что браузер не доверяет самоподписанному SSL-сертификату и отображает уведомление об этом. Несколько раз я пытался с этим разобраться. Я пробовал разные инструкции, но ни одна из них не решила мою проблему. И вот однажды я решил подробно разобраться с этой проблемой и наконец решить ее. Я надеюсь, что эта инструкция поможет вам тоже.

В какой-то момент у меня снова возникли ошибки в браузерах: NET::ERR_CERT_AUTHORITY_INVALID (Google Chrome), MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT (Firefox). И снова мне пришлось разбираться, как решить эту проблему. Я написал новую статью о том, как добавить доверенный SSL-сертификат для локальной среды в Nginx на Debian/Ubuntu. На этот раз мы будем использовать корневой центр сертификации (ЦС).

Эта инструкция была выполнена на операционных системах: Debian 10, Debian 9, Ubuntu 20.10, Ubuntu 20.04, Ubuntu 19.10.

Создание конфигурации OpenSSL

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

nano /tmp/openssl.cnf

Скопируйте и вставьте следующую подготовленную конфигурацию в новый файл, где DNS.1 — это название вашего сервера (укажите DNS.2, если вам нужна поддержка поддоменов):

[req]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = v3_ca # The extensions to add to the self-signed cert

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = New York
localityName = Locality Name (eg, city)
localityName_default = Rochester
organizationName = Organization Name (eg, company)
organizationName_default = Localhost CA
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = Development
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = localhost
commonName_max = 64

[v3_ca]
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
# Support subdomains
#DNS.2 = *.domain.local

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

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

Теперь давайте создадим самоподписанный SSL-сертификат с приватным ключом, используя наш файл конфигурации:

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/localhost.key -out /etc/ssl/certs/localhost.crt -config /tmp/openssl.cnf

где

В процессе генерации сертификата будет задано несколько вопросов. Вы можете пропустить их:

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

Настройка Nginx для использования SSL

Давайте включим SSL в конфигурации сервера Nginx. Мы укажем прослушивание порта 443 (HTTPS) и пути к файлам сертификата и приватного ключа. Отредактируем файл конфигурации сервера /etc/nginx/sites-available/default:

sudo nano /etc/nginx/sites-available/default
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	listen 443 ssl default_server;
	listen [::]:443 ssl default_server;

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

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

	server_name _;

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

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

sudo nginx -t

Теперь применим изменения конфигурации, выполнив команду в терминале:

sudo service nginx reload

Установка утилиты certutil

Теперь нам необходимо добавить сгенерированный SSL-сертификат в базу данных, которую использует браузер. Для управления этой базой данных используется утилита certutil, которая входит в состав пакета libnss3-tools. Если у вас нет этого пакета в системе, тогда установим его.

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

sudo apt-get update

Установим пакет libnss3-tools, выполнив команду в терминале:

sudo apt-get install libnss3-tools

Добавление сертификата в базу данных

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

certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost.crt -i /etc/ssl/certs/localhost.crt

Эта инструкция была протестирована на браузерах: Google Chrome и Opera.

Браузер Mozilla Firefox не хочет доверять сертификату, он использует базу данных cert8.db, которую я редактировал следующим образом:
certutil -d sql:$HOME/.mozilla/firefox/xqck5xx8.default -A -t "P,," -n localhost.crt -i /etc/ssl/certs/localhost.crt

Тестирование шифрования

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

Давайте проверим, что наш сервер доступен по протоколу HTTPS, введя следующий адрес в браузере:

https://localhost

Если вы все сделали правильно, вы увидите, что браузер начал доверять вашему самоподписанному сертификату. Теперь ваше соединение будет зашифровано с использованием протокола HTTPS без отображения предупреждения о незащищенном соединении:

Страница приветствия Nginx с надежным SSL

Другие статьи