HSTS, предотвращающий доступ к поддомену, сопоставленному с localhost с помощью хостов и использующий самоподписанный сертификат - PullRequest
1 голос
/ 21 марта 2020

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 25 апреля 2020

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

Вы можете достичь этого даже для веб-сайта, который вам не принадлежит. Первый обнаруженный мной веб-сайт, имеющий HSTS с директивой includeSubDomains: www.amazon.com.

enter image description here

Итак, я протестировал CRA, работающий на локальном компьютере. 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 с помощью цепочки для ключей (Я на Ма c) и доверял ему. Вы можете сделать это по-другому на других платформах.

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

127.0.0.1 local.www.amazon.com

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

enter image description here

РЕДАКТ. 1:

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

...