Вопрос или проблема
Предыстория:
Я хостингую локальный сервер с несколькими сервисами на машине с 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
Здесь есть две проблемы:
-
Вы использовали общее имя для хранения субъекта сертификата – это устарело в браузерах (и других доверяющих органах). Вместо этого вам нужно добавить субъект к расширению Subject Alternative Name (SAN) вместо этого (или дополнительно).
-
Вы не можете использовать
*.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. Для этого выполните следующие шаги:
-
Откройте "Управление сертификатами":
- Нажмите
Win + R
, введитеcertmgr.msc
и нажмите Enter.
- Нажмите
-
Импортируйте сертификат:
- Найдите папку "Доверенные корневые центры сертификации".
- Щелкните правой кнопкой мыши и выберите "Импортировать".
- Следуйте инструкциям мастера импорта сертификатов, выберите ваш
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. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.