Добавить в корзинуПозвонить
Найти в Дзене

Выпуск самоподписанных и корневых SSL/TLS сертификатов | Linux

Для тестовой среды или в особых случаях может понадобиться выпустить сертификаты самостоятельно. Такие сертификаты не требуют привязки к корневым сертификатам, чтобы их выпустить, воспользуйтесь командой: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crt Для кого-то на начальном этапе этого будет достаточно. Команда генерации корневого сертификата и ключа: openssl req -x509 -new -nodes -days 365 -newkey rsa:2048 -keyout rootCA.key -out rootCA.crt Проверить сертификат и ключ соответственно помогут команды ниже: openssl x509 -text -noout -verify -in rootCA.crt openssl rsa -in rootCA.key -check Чтобы проверить соответствие сертификата и ключа, достаточно сравнить их хэши: openssl x509 -noout -modulus -in rootCA.crt | openssl md5 && \ openssl rsa -noout -modulus -in rootCA.key | openssl md5 Для начала создадим x509v3_config: [req] distinguished_name = dn prompt = no req_extensions = req_ext [dn] CN="test.local" [req_ext] subjectAltName =
Оглавление

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

Самоподписанный сертификат

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

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crt
Информация о выпущенном сертификате
Информация о выпущенном сертификате

Для кого-то на начальном этапе этого будет достаточно.

Корневой сертификат

Команда генерации корневого сертификата и ключа:

openssl req -x509 -new -nodes -days 365 -newkey rsa:2048 -keyout rootCA.key -out rootCA.crt
Генерация rootCA.key и rootCA.crt
Генерация rootCA.key и rootCA.crt

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

openssl x509 -text -noout -verify -in rootCA.crt
openssl rsa -in rootCA.key -check

Чтобы проверить соответствие сертификата и ключа, достаточно сравнить их хэши:

openssl x509 -noout -modulus -in rootCA.crt | openssl md5 && \
openssl rsa -noout -modulus -in rootCA.key | openssl md5
Сравнение хеш-сумм сертификата и ключа
Сравнение хеш-сумм сертификата и ключа

Выпуск CSR

Для начала создадим x509v3_config:

[req]
distinguished_name = dn
prompt = no
req_extensions = req_ext
[dn]
CN="test.local"
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.0 = test.local
DNS.1 = *.test.local

*документация по заполнению x509v3_config доступна здесь

Конфиг я сохранил в test.local.x509v3.config
Конфиг я сохранил в test.local.x509v3.config

С помощью этого конфига сгенерируем CSR (Certificate Signing Request):

openssl req -new -newkey rsa:2048 -nodes -out test.local.csr -keyout test.local.key -config test.local.x509v3.config

Проверка CSR и ключа:

openssl req -text -in test.local.csr
openssl rsa -in test.local.key -check

Выпуск сертификата

openssl x509 -req -in test.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out test.pem -days 365 -extensions req_ext -extfile test.local.x509v3.config
Выпуск сертификата
Выпуск сертификата

Собираем сертификат и ключ

В итоговый сертификат добавляем содержимое test.pem и rootCA.crt, в качестве ключа берём test.local.key:

cat test.pem rootCA.crt > test.crt
cp test.local.key test.key

Добавляем собранный сертификат на веб-сервер

Пример добавления в nginx для дефолтного сайта
Пример добавления в nginx для дефолтного сайта

Теперь соединение будет шифроваться, но в браузере будет предупреждение о неизвестном сертификате:

Предупреждение безопасности
Предупреждение безопасности

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

Импортируем rootCA.crt в браузер, чтобы доверять нашим сертификатам:

Процесс импорта в Mozilla Firefox
Процесс импорта в Mozilla Firefox
Сертификат нашего центра сертификации добавлен
Сертификат нашего центра сертификации добавлен

После этого обновляем страницу:

Подтверждение получено
Подтверждение получено

Для поддоменов та же история благодаря тому, что в test.local.x509v3.config мы добавили *.test.local:

Сайты вида *.test.local также будут открываться без предупреждений
Сайты вида *.test.local также будут открываться без предупреждений