@BertiK0_0

Cамоподписанный сертификат SSL добавить в список доверенных в браузере?

Доброго времени суток.

У меня такой вопрос от начинающего, есть задача перейти с 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
  • Вопрос задан
  • 860 просмотров
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev
software engineer
в том-то и прикол, что
1) если нет выхода в интернет, то как клиенты своими браузерами к вам будут заходить?
2) если нет выхода в интернет, то где клиенты будут сами браузер брать и обновлять будут откуда?
3) В этом и заключается суть самоподписанных сертификатов - сами мучайтесь как их ставить клиентам. Или покупайте готовые сертификаты (либо бесплатный летс енкрипт), который уже встроен во все браузеры
Ответ написан
@dronmaxman
VoIP Administrator
BertiK0_0, Для соблюдения доверия необходимо несколько придерживаться нескольких правил.
1) Должна быть валидна дата окончания сертификата, у ключа нет срока действия, только у сертификата.
2) Уровень шифрование не ниже SHA256
3) Длина ключа не меньше 2048 bits.
4) CN в сертификате должен совпадать с доменным именем, можно указать несколько CN (alternative name) в том числе IP.
5) Использовать необходимо 443 порт
6) В системе или браузере должен быть установлен рутовый сертификат, ключем которого был подписан сертификат сервера.

Сертификат устанавливается в систему кроме некоторорых исключений (firefox), все популярые ОС имеют встроенный инструмент для установки сертификата (double click). Скрок действия сертификат может быть 10 и 30 лет, не критично, но некоторым браузерм не нравятся сертификаты со сроком жизни более 2х лет.
Не стоит сразу поднимать подключение с сертификатом. Пусть пользователь после установки ПО зайдет на 80 порт, и укажет необхимые параметры сертификата (доменное имя и срок службы), скачает рутовый сертификат и после этого сервер активирует редирект на 443 порт.

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

Посмотри как это делают другие, например PfSence, Fortigate, они из коротби тоже идут с самоподписанными сертификатами и предлагают скачать и установить свой рут.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы