HSTS предотвращает доступ к поддомену, сопоставленному с локальным хостом, с использованием хостов и с использованием самозаверяющего сертификата.

Я использую CRA (Create React App) и привязываю его к local.example.com:443, используя следующий файл .env:

HOST=local.example.com
PORT=443
HTTPS=true

Это гарантирует, что когда я запускаю каркас CRA, он пытается выполнить привязку к local.example.com:443 и выдает самозаверяющий сертификат. Я могу принять самоподписанный в браузере и иметь локальный сайт с поддержкой HTTPS. HTTPS необходим для некоторых вещей, таких как файлы cookie Secure и т. д., поэтому он нужен мне как для локальной разработки, так и для удаленного развертывания. Кроме того, proxy можно установить на example.com, чтобы локальный интерфейс использовал удаленный сервер при тестировании, что является еще одним мотивом для этой настройки.

Это работает, когда имя хоста (example.com) не имеет HSTS, но когда оно есть, непринятый самозаверяющий сертификат, который создает CRA, отклоняется. Сертификат создается для localhost, это первая проблема, потому что HSTS example.com требует, чтобы сертификат был выдан для example.com, чтобы быть действительным. Fire Fox:

Firefox не доверяет этому сайту, так как он использует сертификат, недействительный для local.example.com. Сертификат действителен только для следующих имен: localhost, localhost.localdomain, lvh.me, *.lvh.me, [::1], 127.0.0.1, fe80::1.

Но вдобавок ко всему, поскольку это самоподписанный сертификат, браузер отклонит его, если только пользователь не примет его первым, что можно сделать без HSTS, потому что страница с предупреждением о самоподписанном сертификате позволяет это сделать. , но с HSTS отображается другая страница с предупреждением (та, которая показывает указанную выше ошибку), в которой говорится, что HSTS не разрешает навигацию, и вы тост.

В Chrome можно игнорировать HSTS, набрав letmein на странице предупреждения HSTS, что работает, но это не решение в Firefox, и мне интересно, есть ли лучший способ.

Может ли CRA выдать сертификат так, как если бы он был выдан для example.com, чтобы HSTS example.com принял его? Я предполагаю, что все еще будет проблема с самозаверяющим сертификатом, но если это возможно, может быть, вместо этого будет показана страница с предупреждением о самозаверяющем сертификате, и пользователь сможет принять сертификат и продолжить?


person Tomáš Hübelbauer    schedule 21.03.2020    source источник


Ответы (1)


Чтобы «обойти» HSTS локально, вам необходимо сгенерировать действительный сертификат для вашего локального домена.
Минимальной установкой будет создание самозаверяющего сертификата с правильными CN и SAN.

Вы можете добиться этого даже для веб-сайта, которым вы не владеете. Первый веб-сайт, на котором я нашел HSTS с директивой includeSubDomains, — это www.amazon.com.

введите здесь описание изображения

Поэтому я протестировал CRA, работающий на local.www.amazon.com.
Для этого я сгенерировал закрытый ключ и сертификат с помощью следующей команды:

openssl req \
    -x509 \
    -newkey rsa:4096 \
    -sha256 \
    -days 90 \
    -nodes \
    -keyout noca.local.www.amazon.com.key \
    -out noca.local.www.amazon.com.crt \
    -subj '/CN=local.www.amazon.com' \
    -extensions san \
    -config <( \
    echo '[req]'; \
    echo 'distinguished_name=req'; \
    echo '[san]'; \
    echo 'subjectAltName=DNS:local.www.amazon.com')

Мой файл .env выглядит так:

HOST=local.www.amazon.com
PORT=5000 
HTTPS=true
SSL_CRT_FILE=noca.local.www.amazon.com.crt
SSL_KEY_FILE=noca.local.www.amazon.com.key

Я открываю файл crt с помощью Связки ключей (у меня Mac) и доверяю ему. Вы можете сделать это по-другому на других платформах.

Вам также придется отредактировать файл hosts (у меня /etc/hosts) и добавить следующую строку:

127.0.0.1 local.www.amazon.com

И вот результат:

введите здесь описание изображения

РЕДАКТИРОВАТЬ 1:

Если вам нужно сделать это для нескольких веб-сайтов, вы можете создать локальный ЦС, который вы сами подписываете.
И тогда вы будете генерировать все свои сертификаты с помощью этого ЦС.
Преимущество будет заключаться в том, что у вас просто будет чтобы доверять сертификату CA один раз (в цепочке ключей или в сертификатах Chrome CA или что-то еще, что используется для доверия сертификатам)

person florian    schedule 25.04.2020