Как заставить Edge и Chrome доверять самоподписанному сертификату?

Вопрос или проблема

Предыстория:

Я хостингую локальный сервер с несколькими сервисами на машине с Linux (Ubuntu 20.04) по адресу myIP.

Моя конфигурация NGINX использует самоподписанный SSL-сертификат для обслуживания следующих доменов:

domain.local
api.domain.local
logs.domain.local
superset.domain.local

Самоподписанный сертификат (domain.crt) был сгенерирован с использованием следующих команд:

openssl genrsa -out ./certs/domain.key 2048
openssl req -new -key ./certs/domain.key -out ./certs/domain.csr \
    -subj "/C=US/ST=State/L=City/O=Organization/CN=*.domain.local"
openssl x509 -req -days 365 -in ./certs/domain.csr -signkey ./certs/domain.key -out ./certs/domain.crt

Однако при доступе к https://domain.local
в Microsoft Edge или Chrome браузер помечает соединение как “Не защищено”.

Что я пробовал:

Убедился, что сертификат был успешно импортирован в хранилище доверенных корневых центров сертификации.

Убедился, что разрешение DNS работает правильно.
Пингование доменов (domain.local, api.domain.local и т.д.) разрешается на правильный IP.

Проверил логи NGINX, которые не показывают ошибок, связанных с SSL.

Подтвердил, что сертификаты domain.key и domain.crt корректно подключены в контейнере.

Проверил, что NGINX запускается успешно без каких-либо проблем.
Доступ к приложению хорошо работает по HTTPS, но браузер не доверяет соединению.

Среда:

ОС сервера: Ubuntu 20.04
Браузер: Microsoft Edge, Chrome (последняя версия на Windows 11)
Локальная сеть: Все устройства находятся в одной локальной сети

Вопрос:

Как я могу заставить Microsoft Edge или Chrome доверять самоподписанному сертификату для моих локальных доменов?

Есть ли конкретный шаг, который я пропустил при настройке или импорте сертификата?

Любая помощь была бы оценена!

Сертификаты с подстановочным знаком не работают таким образом. Вы создаете сертификат для *.domain.tld. Это означает, что он будет работать для всех хостов в форме something.domain.tld, он ожидает наличие имени хоста перед доменом. И не будет обслуживать domain.tld, потому что здесь domain является именем хоста, а .tld – доменом.

Вы можете попробовать добавить SAN (Alternative Name для субъекта). Но в вашем случае (с сертификатом с подстановочным знаком) на мой взгляд это может не сработать (в зависимости от настроек CA).

Предупреждение: Не пытайтесь создать сертификат для *.tld, потому что это не будет работать для something.domain.tld, это будет работать только для something.tld.

Единственным решением является явное перечисление всех хостов в сертификате через SAN

Здесь есть две проблемы:

  1. Вы использовали общее имя для хранения субъекта сертификата – это устарело в браузерах (и других доверяющих органах). Вместо этого вам нужно добавить субъект к расширению Subject Alternative Name (SAN) вместо этого (или дополнительно).

  2. Вы не можете использовать *.domain.local для domain.local, только для субдоменов domain.local. Поэтому вам нужен сертификат с двумя записями SAN – одна для domain.local и другая для *.domain.local.

Попробуйте настройку, такую как эта (назовите ее minimal.cfg):

prompt             = no
distinguished_name = req_dn
req_extensions     = req_ext

[ req_dn ]
commonName         = Local Web Service

[ req_ext ]
# basicContraints может быть обязательным для Firefox?
# basicConstraints = critical, CA:true
# Удалите все, что ниже этой строки, если вам не нужен SAN.
subjectAltName = @alt_names

[alt_names]
DNS.1 = domain.local
DNS.2 = *.domain.local

Затем создайте самоподписанный сертификат с:

openssl req -x509 -new -newkey rsa:2048 -nodes -days 365 -keyout domain.key -out domain.cer -config minimal.cnf -extensions req_ext

Вам, возможно, придется настроить приведенное выше под вашу установку.

Ответ или решение

Чтобы сделать Microsoft Edge и Google Chrome доверяющими вашим самоподписанным сертификатам, вам необходимо учесть несколько важных шагов и настроек. Ниже представлены рекомендации, основанные на вашем описании проблемы и текущей конфигурации сервера.

1. Создание сертификата с поддержкой SAN

Как вы уже заметили, использование Common Name (CN) для обозначения субъекта сертификата устаревает. Вам необходимо явно указать доменные имена в расширении Subject Alternative Name (SAN). Для вашей ситуации, следуйте этим шагам для создания нового сертификата:

Пример конфигурационного файла minimal.cfg:

prompt             = no
distinguished_name = req_dn
req_extensions     = req_ext

[ req_dn ]
commonName         = Local Web Service

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS.1 = domain.local
DNS.2 = *.domain.local
DNS.3 = api.domain.local
DNS.4 = logs.domain.local
DNS.5 = superset.domain.local

Генерация сертификата:

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

openssl req -x509 -new -newkey rsa:2048 -nodes -days 365 -keyout domain.key -out domain.crt -config minimal.cfg -extensions req_ext

2. Установка сертификата в хранилище доверенных корневых сертификатов

После генерации сертификата его необходимо установить в хранилище доверенных сертификатов Windows. Для этого выполните следующие шаги:

  1. Откройте "Управление сертификатами":

    • Нажмите Win + R, введите certmgr.msc и нажмите Enter.
  2. Импортируйте сертификат:

    • Найдите папку "Доверенные корневые центры сертификации".
    • Щелкните правой кнопкой мыши и выберите "Импортировать".
    • Следуйте инструкциям мастера импорта сертификатов, выберите ваш domain.crt и завершите процесс.

3. Проверка конфигурации NGINX

Убедитесь, что ваш NGINX настроен на использование нового самоподписанного сертификата. Вот пример конфигурации для nginx.conf:

server {
    listen 443 ssl;
    server_name domain.local api.domain.local logs.domain.local superset.domain.local;

    ssl_certificate     /path/to/your/domain.crt;
    ssl_certificate_key /path/to/your/domain.key;

    location / {
        proxy_pass http://your_backend_service;
    }
}

4. Очистка кэша браузера

После выполнения всех вышеописанных шагов вы можете столкнуться с проблемой кэширования сертификатов. Чтобы избежать этого:

  • Откройте Chrome или Edge.
  • Перейдите в настройки конфиденциальности.
  • Найдите опции для очистки данных браузера и выберите "Очистить кэш и куки".

5. Тестирование сертификата

После завершения вышеуказанных шагов перезапустите NGINX и попробуйте снова подключиться к адресам ваших сервисов. Если все было сделано правильно, браузеры должны больше не выдавать предупреждений о ненадежных сертификатах.

Вывод

Следуя этим инструкциям, вы настроите свою локальную среду для использования самоподписанных сертификатов, что позволит вам избежать проблем с безопасностью в браузерах Microsoft Edge и Google Chrome. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...