Доброго времени суток.
У меня такой вопрос от начинающего, есть задача перейти с http на https, используемая ОС Ubuntu 22.04, сервер написан на nodejs.
Порядок действий следующий : клиент на флэхе получает 2 deb пакета, которые он ставит себе на комп (ОС клиента может быть любой Mac, Windows, Ubuntu и др.). Итак, значит 2 deb пакета - 1-й с ПО и 2-й с web gui, после установки последнего запускается скрипт по созданию самоподписанного сертификата SSL.
Описание создания SSL
Создал сертификаты и ключи (код ниже, сделал небольшой скрипт gen_ssl.sh), причем читал инфо о том, что ключи и сертификат будут работать только 13 мес. и не более того (
https://habr.com/ru/companies/globalsign/articles/...), решил проверить это сам. Причем проверена работоспособность 10-ти и 100-летнего сертификатов на клонированной "чистой" виртуальной машине (Ubuntu 22.04). В браузеры (FireFox, Google Chrom, Yandex, Edge) импортирован sd_wan_wbui_ca.crt (корневой сертификат) и добавлен в качестве доверенного. Дата на виртуалке переведена на 8 лет вперед, для проверки 10-го сертификата - никаких предупреждений не возникло, далее дата переведена на 11 лет вперед и тут, предупреждение о сертификате появилось. Затем, импортирован 100-й сертификат и дата переведена на 60 лет вперед и тут тоже все работает без ошибок, предупреждение не возникает, но возникает после перевода даты за 100 лет.
На данном этапе разработки для хранения файлов создал папки cert (для хранения localhost.crt, localhost.csr, localhost.key) и CA (для хранения sd_wan_wbui_ca.crt и sd_wan_wbui_ca.key). Первый вопрос по тому, какой путь для хранения этих файлов необходим для клиента ? Или это не принципиально и он может их хранить хоть на рабочем столе ? Возможно стоит сделать так, чтобы сформированные файлы попали в какую-то общую папку, типа usr/share/local, одинаков ли путь для разных ОС?
И ещё один вопрос, который я сейчас пытаюсь решить - это как клиент получит этот сертификат, чтобы добавить его себе в список доверенных в браузере? Поясню, т.к. мы не знаем какой браузер и какую ОС будет использовать клиент, понятно только то, что добавлять доверенный сертификат в свой браузер клиент должен стандартными средствами и нужно дать ему возможность через интерфейс web gui, этот сертификат от сервера получить в этом самом браузере при обращении к web gui. То есть на сервере, где устанавливается продукт скрипты для добавления доверенных сертификатов в настройки браузера не нужны, а для компьютера клиента, где будет запускаться браузер, мы их написать не можем, т.к. ничего про этот компьютер не знаем. Какие могут быть решения? Можно ли это сделать с помощью JavaScript, если да то как? Может сделать отдельную кнопку (типа "скачать сертификат"), нажав на которую сертификат загрузится? Или при первичном обращении клиента к web gui, браузер 1 раз "ругнется", клиент подтвердит переход и по средствам JS сертификат загрузится в "загрузки" или попадет в списки доверенных в браузер (нашел скрипт для приложений, таких как Firefox, Thunderbird, Chromium, Chrome, которые хранят свои списки доверенных сертификатов в файлах cert8.db и cert9.db и этот скрипт позволяет добавить свой сертификат в каждый из этих файлов, благодаря чему, зайдя в настройки сертификатов в браузере, можно увидеть добавленный корневой сертификат нашего приложения (код ниже прилагаю, проверял его - он работает)). Возможно есть еще что-либо, буду благодарен за любую помощь и подсказку, по возможности, напишите ответ, так сказать попроще, т.к. в терминологии не особо силен.
Скрипт gen_ssl.sh
#!/bin/bash
CERT_FILE_CA="sd_wan_wbui_ca"
CERT_NAME_CA="SD_WAN_WBUI_CA"
CERT_FILE_CLIENT="localhost"
CERT_NAME_CLIENT="SD_WAN_WBUI_CLIENT"
#Создать файлы сертификата и ключа валидностью на 100 лет
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -days 36500 -keyout ${CERT_FILE_CA}.key -out ${CERT_FILE_CA}.crt -subj "/C=RU/CN=${CERT_NAME_CA}"
#Создать приватный ключ для приложения (localhost.key)
openssl genrsa -out ${CERT_FILE_CLIENT}.key 2048
#Создать запрос на подпись сертифката для приватного ключа (localhost.csr)
openssl req -key ${CERT_FILE_CLIENT}.key -new -out ${CERT_FILE_CLIENT}.csr -subj "/C=RU/CN=${CERT_NAME_CLIENT}"
#Добавить дополнительные расширения для сертификата, которые будут добавлены в процессе его подписания, для этого создается файл localhost.ext
echo 'authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName=@alt_names
[alt_names]
DNS.1=localhost
DNS.2=127.0.0.1
DNS.3=::1' \
> ${CERT_FILE_CLIENT}.ext
#Подписать сертификат корневым сертификатом sd_wan_wbui_ca.crt и получить в результате файл localhost.crt (срок валидности 100 лет)
openssl x509 -req -CA ${CERT_FILE_CA}.crt -CAkey ${CERT_FILE_CA}.key -in ${CERT_FILE_CLIENT}.csr -out ${CERT_FILE_CLIENT}.crt -days 36500 -CAcreateserial -extfile ${CERT_FILE_CLIENT}.ext
# Создать папки cert (для хранения localhost.crt, localhost.csr, localhost.key) и CA (для хранения sd_wan_wbui_ca.crt и sd_wan_wbui_ca.key).
# Флаг -p, утилита mkdir проверит, не существует ли уже каталог, файл, ссылка или канал с таким именем.
# Если он существует, он не изменит существующий каталог или файл и не покажет сообщение об ошибке (mkdir: cannot create directory 'cert' и 'CA': File exists).
mkdir -p ../cert
mkdir -p ../CA
# Флаг -f в mv используется для принудительной перезаписи существующего файла без запроса.
mv -f localhost.crt localhost.key localhost.csr ../cert
mv -f sd_wan_wbui_ca.crt sd_wan_wbui_ca.key ../CA
# Удаление файла localhost.ext, т.к. в нем нет необходимости после подписания сертификата корневым сертификатом sd_wan_wbui_ca.crt
rm -rf localhost.ext
# СКРИПТ ДОБАВЛЕНИЯ в списки доверенных сертификатов в файлы cert8.db и cert9.db для Firefox, Thunderbird, Chromium, Chrome.
# Установка certutil
apt install libnss3-tools
for certDB in $(find ~/ -name "cert8.db")
do
CERT_DIR=$(dirname ${certDB});
certutil -A -n "${CERT_NAME_CA}" -t "TCu,Cu,Tu" -i ${CERT_FILE_CA}.crt -d dbm:${CERT_DIR}
done
for certDB in $(find ~/ -name "cert9.db")
do
CERT_DIR=$(dirname ${certDB});
echo ${CERT_DIR}
certutil -A -n "${CERT_NAME_CA}" -t "TCu,Cu,Tu" -i ${CERT_FILE_CA}.crt -d sql:${CERT_DIR}
done