Как проверить, использует ли сайт HSTS и HSTS preload


Оглавление

1. Что такое HTTP Strict Transport Security (HSTS) и о чём нужно знать, если вы собираетесь подключить HSTS

2. Как веб-браузеры узнают, что сайт использует HSTS

3. Значение директив заголовка HTTP Strict Transport Security (HSTS)

4. Предварительная загрузка Strict Transport Security (HSTS Preload)

5. Как проверить HSTS веб-сайта

6. Как проверить HSTS preload веб-сайта

6.1 Как проверить HSTS preload веб-сайта в графическом интерфейсе / онлайн

6.2 Как проверить HSTS preload веб-сайта в командной строке

6.3 Как проверить HSTS preload веб-сайта без сторонних сервисов

6.3.1 hstspreload

6.3.2 Используя список из файла HSTS preload веб-браузера Chromium

7. Онлайн сервисы проверки HSTS и HSTS preload веб-сайтов

8. Тестирование HSTS. Как удалить настройки HSTS для определённых сайтов в веб-браузере

8.1 Как удалить настройки HSTS из Chromium / Google Chrome

8.2 Как удалить настройки HSTS из Firefox

8.3 Как создать профиль Firefox для тестирования HSTS

8.4 Как тестировать HSTS с помощью cURL

8.5 Как тестировать HSTS с помощью wget


1. Что такое HTTP Strict Transport Security (HSTS) и о чём нужно знать, если вы собираетесь подключить HSTS

HSTS (сокр. от англ. HTTP Strict Transport Security) — механизм, принудительно активирующий защищённое соединение через протокол HTTPS. Данная политика безопасности позволяет сразу же устанавливать безопасное соединение вместо использования HTTP-протокола. Механизм использует особый заголовок Strict-Transport-Security для принудительного использования браузером протокола HTTPS даже в случае перехода по ссылкам с явным указанием протокола HTTP (http://). Механизм описан в RFC6797 в ноябре 2012 года.

HSTS помогает предотвратить часть атак, направленных на перехват соединения между пользователем и веб-сайтом, в частности атаку с понижением степени защиты и угон куки (cookie).


Проще говоря, если веб-сайт использует HSTS, то веб-сервер не будет подключаться к этому сайту по протоколу HTTP независимо от других настроек веб-сервера и переадресаций. Это, кстати, имеет довольно неочевидные последствия: если вы захотите перевести сайт, использующий HSTS, на протокол HTTP (например, вы не хотите покупать сертификат для веб-сайта или вам необходимо, чтобы некоторые страницы не использовали HTTPS), то у вас это не получится — веб-браузеры, которые уже обращались к вашему сайту на HTTPS, не будут подключаться к нему по HTTP (по крайней мере, до истечения срока действия заголовка, который обычно устанавливают на 1 год).

2. Как веб-браузеры узнают, что сайт использует HSTS

Имеется 2 способа, которым веб-браузеры могут узнать, что сайт использует HSTS:

1) HTTP заголовок веб-сервера сообщает, что данный веб-сайт использует HSTS. Пример такого заголовка:

strict-transport-security: max-age=31536000

После получения такого заголовка, веб-браузер пользователя запоминает, что данный сайт использует HSTS и впоследствии пытается подключиться к нему только по протоколу HTTPS, запрещая использование HTTP.

Как можно догадаться, слабым звеном здесь является самая первая передача заголовка со значением «strict-transport-security».

2) Списки, в которых собраны сайты, использующие HSTS. Такой список обслуживает Google и он поддерживается всеми веб-браузерами. Подробности смотрите по ссылкам:

3. Значение директив заголовка HTTP Strict Transport Security (HSTS)

Примеры заголовков HTTP Strict Transport Security (HSTS):

strict-transport-security: max-age=31536000
strict-transport-security: max-age=63072000; includeSubDomains; preload

Как можно понять, заголовок начинается со строки «strict-transport-security: », за которой идут директивы. Рассмотрим значение этих директив

max-age=ВРЕМЯ ЭКСПИРАЦИИ

Время в секундах, в течение которого браузер должен помнить, что доступ к сайту возможен только по протоколу HTTPS. Например, значение 31536000 соответствует одному году. А значение 300 соответствует 5 минутам.

includeSubDomains

Необязательная директива. Если указан этот необязательный параметр, это правило применяется также ко всем поддоменам сайта.

preload

Необязательная и нестандартная директива. Предварительная загрузка Strict Transport Security. При использовании предварительной загрузки директива max-age должна быть не менее 31536000 (1 год), а директива includeSubDomains должна присутствовать. Не является частью спецификации.

4. Предварительная загрузка Strict Transport Security (HSTS Preload)

Google поддерживает службу предварительной загрузки HSTS. Следуя рекомендациям и успешно отправив свой домен, вы можете быть уверены, что браузеры будут подключаться к вашему домену только через защищённые соединения. Хотя служба поддерживается Google, все браузеры используют этот список предварительной загрузки. Однако он не является частью спецификации HSTS и не должен рассматриваться как официальный. Смотрите также:


Обратите внимание, что в HSTS Preload могут быть включены как отдельные домены (вместе со всеми поддоменами), так и домены верхнего уровня (top-level domain, TLD) целиком. Например, все сайты в доменной зоне .dev должны иметь валидный SSL сертификат, иначе к сайту будет невозможно подключиться.

Для сайтов с доменами верхнего уровня включённых в HSTS Preload также можно получать бесплатные тестовые сертификаты на 3 месяца (и пользоваться этой схемой годами). Например, в моих тестах я без проблем получил бесплатный SSL сертификат для домена .dev при подтверждении владения доменом с помощью DNS записи. В теории, может возникнуть проблема подтверждения владения доменом если для подтверждения вы используете HTTP запросы. Хотя, возможно, инструменты командной строки будут игнорировать HSTS Preload и всё равно удастся подтвердит владение с помощью HTTP запроса (например, если вы используете такой инструмент как acme-tiny) — я это не проверял.

Также смотрите:

5. Как проверить HSTS веб-сайта

Поскольку вся суть использования HSTS заключается в передачи веб-браузеру заголовка strict-transport-security, то достаточно проверить, имеется ли этот заголовок в ответе веб-сервера. Это можно сделать командной вида:

curl -s -D- URL | grep -i -E '^strict'

Например:

curl -s -D- https://pattaya-pages.com/ | grep -i -E '^strict'
curl -s -D- https://suip.biz/ | grep -i -E '^strict'

Если заголовок выведен, значит HSTS используется. Если ничего не выведено, значит:

  1. HSTS не используется
  2. ИЛИ какая-то другая ошибка, например, не удалось подключиться к серверу

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

url='https://hackware.ru';
r=`curl -s -D- $url | grep -i -E '^Strict'`; [ -n "$r" ] && echo -e "HTTP Strict Transport Security is enabled\n${r%$'\r'}" || echo 'HTTP Strict Transport Security is NOT enabled'

Обратите внимание, что URL нужно указывать в качестве значения переменной $url:

url='https://suip.biz';
r=`curl -s -D- $url | grep -i -E '^Strict'`; [ -n "$r" ] && echo -e "HTTP Strict Transport Security is enabled\n${r%$'\r'}" || echo 'HTTP Strict Transport Security is NOT enabled'

6. Как проверить HSTS preload веб-сайта

6.1 Как проверить HSTS preload веб-сайта в графическом интерфейсе / онлайн

Вы можете перейти на официальный сайт https://hstspreload.org и там ввести интересующий вас домен для проверки HSTS preload. Там же вы можете добавить свой сайт в HSTS preload или запросить исключить его из HSTS preload (это может затянуться надолго!).

6.2 Как проверить HSTS preload веб-сайта в командной строке

Для проверки в командной строке вы можете использовать Puppeteer + сайт hstspreload.org.

Для этого установите пакет Puppeteer (раздел «Установка Puppeteer»), создайте файл hstspreload-status.js и скопируйте в него:

let puppeteer;
try {
	puppeteer = require('/usr/lib/node_modules/puppeteer');
} 
catch (error) {
	try {
		puppeteer = require('/usr/local/lib/node_modules/puppeteer');
	} 
	catch (error) {
		try {
			puppeteer = require('puppeteer');
		} 
		catch (error) {
			console.log('Please install "puppeteer" package');				
		}
	}
}

function delay(time) {
	return new Promise(function(resolve) { 
		setTimeout(resolve, time)
	});
}

async function run() {
	if (puppeteer == null) return;

	const url = 'https://hstspreload.org/?domain=' + process.argv[2];
	const browser = await puppeteer.launch();
	const page = await browser.newPage();
	const customUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
	
	await page.setViewport({width: 1440, height: 3440});
	await page.setUserAgent(customUserAgent);
	await page.goto(url);
    
	await page.waitForSelector('#status');
	await delay(5000); 
	const tag = await page.$eval('#status', el => el.innerText)
	console.log(tag);
     
	browser.close();
}
 
run();

Запустите проверку следующей командой, где вместо DOMAIN укажите интересующий вас сайт:


node hstspreload-status DOMAIN

Например:

node hstspreload-status hackware.ru
node hstspreload-status paypal.com
node hstspreload-status www.paypal.com
node hstspreload-status youtube.com

Домены верхнего уровня (top-level domain, TLD) тоже можно проверять этим способом:

node hstspreload-status com
node hstspreload-status dev
node hstspreload-status microsoft

6.3 Как проверить HSTS preload веб-сайта без сторонних сервисов

6.3.1 hstspreload

Поскольку HSTS preload имеется в исходном коде веб-браузера Chromium, а исходный код этого веб-браузера открыт, то можно выполнять проверку доменов на присутствие в HSTS preload используя этот файл.

Вы можете использовать различные альтернативы, у меня получилось воспользоваться hstspreload.


hstspreload — это список Chromium HSTS Preload в виде пакета Python.

Пакет предоставляет одну функцию: in_hsts_preload(), которая принимает хост с кодировкой IDNA и возвращает True или False относительно того, следует ли осуществлять доступ к этому хосту только через HTTPS.

Этот пакет полностью создан с помощью автоматизированного скрипта, который запускается раз в месяц. То есть данные в этом пакете обновляются раз в месяц.

Файл, который используется в качестве источника данных (файл в кодировке Base64): https://chromium.googlesource.com/chromium/src/+/main/net/http/transport_security_state_static.json?format=TEXT

О том, как установить hstspreload смотрите на странице https://kali.tools/?p=7424 (раздел «Установка hstspreload»).

Создайте файл hstspreload_checker.py и скопируйте в него следующее содержимое:

from sys import argv
import hstspreload

host = argv[1]
print (hstspreload.in_hsts_preload(host))

Запускайте файл следующим образом:

python hstspreload_checker.py DOMAIN

Например, следующая команда проверит, имеется ли домен suip.biz в списке HSTS preload:

python hstspreload_checker.py suip.biz

Ещё примеры проверки:

python hstspreload_checker.py hackware.ru
python hstspreload_checker.py youtube.com
python hstspreload_checker.py paypal.com
python hstspreload_checker.py www.paypal.com

Вы также можете проверять домены верхнего уровня (top-level domain, TLD):

python hstspreload_checker.py com
python hstspreload_checker.py net
python hstspreload_checker.py dev
python hstspreload_checker.py microsoft
python hstspreload_checker.py youtube

Если домен верхнего уровня добавлен в список HSTS preload, то все домены второго и любого последующего уровней также будут доступны только по протоколу HTTPS:

python hstspreload_checker.py just.whatever.if.dev

6.3.2 Используя список из файла HSTS preload веб-браузера Chromium

Уже разобравшись с hstspreload, я подумал, зачем нам посредник? Вы можете скачать файл списка HSTS preload следующим образом (нужно сделать только один раз):

curl 'https://chromium.googlesource.com/chromium/src/+/main/net/http/transport_security_state_static.json?format=TEXT' > transport_security_state_static.txt
cat transport_security_state_static.txt | base64 -d > hstspreload.txt

Затем вы можете выполнить поиск по доменам следующим образом:

grep '"DOMAIN"' hstspreload.txt

Например:

grep '"youtube.com"' hstspreload.txt

Найдено:

    { "name": "youtube.com", "policy": "google", "mode": "force-https", "include_subdomains": true },

Обратите внимание, что вначале идут одинарные, а потом двойные кавычки — этим достигается поиск по точному соответствию. Если вы хотите искать по части имени, то кавычки не нужно использовать, например:

grep youtube.com hstspreload.txt

Найдено:

    { "name": "withyoutube.com", "policy": "google", "mode": "force-https", "include_subdomains": true },
    { "name": "youtube.com", "policy": "google", "mode": "force-https", "include_subdomains": true },

Этот способ позволяет искать домены верхнего уровня, но в этом случае их нужно поместить в кавычки, как показано чуть выше, например:

grep '"dev"' hstspreload.txt

Будет найдено:

    { "name": "dev", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true },

7. Онлайн сервисы проверки HSTS и HSTS preload веб-сайтов

Если вам не хочется устанавливать никакие инструменты, то вы можете проверить наличие strict-transport-security заголовка, а также включён ли сайт в список HSTS preload с помощью следующего сервиса (вам нужно ввести адрес веб-страницы для проверки):

Этот сервис выведет результат проверки, а также покажет заголовок strict-transport-security со всеми его значениями для проверяемого веб-сайта.

Если вы хотите проверить домен верхнего уровня на предмет включения в список HSTS preload, то вам идеально подойдёт следующий сервис:

8. Тестирование HSTS. Как удалить настройки HSTS для определённых сайтов в веб-браузере

Если вы разработчик или веб-мастер и вы тестируете HSTS на localhost или другом домене в среде для разработки, то вам нужно быть аккуратнее HSTS, поскольку эти настройки намертво прописываются в веб-браузерах.

Вы можете попасть в следующую интересную ситуацию:

  1. Ваш localhost отправляет веб-браузеру заголовок HSTS
  2. Веб-браузер после получения заголовка HSTS отказывается подключаться к localhost (или другому домену в среде разработки) по HTTP
  3. … Собственно, это финиш, потому что до недавнего времени в Google Chrome не было удобного способа удалить настройку HSTS для определённого сайта, а в Firefox вообще нет рабочего способа удалить записи HSTS

Как результат, вы оказываетесь в неловкой ситуации, когда с localhost из веб-браузера вы можете связаться только по протоколу HTTPS…

8.1 Как удалить настройки HSTS из Chromium / Google Chrome

В адресной строке веб-браузера введите:

chrome://net-internals/#hsts

В поле Query HSTS/PKP domain вы можете проверить, применяется ли HSTS для домена.

Если для домена используется HSTS, то будет выведено много строк. Строки, судя по всему, дублируются. Все строки делятся на две группы:

  • те, которые начинаются со «static» - если значения этих строк не является пустым, значит домен использует HSTS preload

  • те, которые начинаются с «dynamic» - если значения этих строк не является пустым, значит домен использует HSTS согласно заголовку strict-transport-security
Found:
……………………….
……………………….
……………………….
static_sts_domain:
static_upgrade_mode: UNKNOWN
static_sts_include_subdomains:
static_sts_observed:
static_pkp_domain:
static_pkp_include_subdomains:
static_pkp_observed:
static_spki_hashes:
dynamic_sts_domain: hackware.ru
dynamic_upgrade_mode: FORCE_HTTPS
dynamic_sts_include_subdomains: false
dynamic_sts_observed: 1735963517.717188
dynamic_sts_expiry: 1767499517.717185

Вы НЕ можете удалить сайт, если он помещён в HSTS preload. Для удаления других сайтов, введите имя домена в поле «Delete domain security policies» и нажмите кнопку «Delete».

Чтобы убедиться, что данные о домене удалены, вновь сделайте запрос в «Query HSTS/PKP domain».

8.2 Как удалить настройки HSTS из Firefox

Вы можете найти в Интернете пару способов удаления HSTS из Firefox, но в настоящее время они не работают.

Я не пробовал этот способ, но если вам нечего терять, то отправьте с домена, который вы хотите исключить из HSTS, заголовок strict-transport-security с директивой max-age установленной на очень маленькое значение, например:

strict-transport-security: max-age=3

Возможно, этому заголовку удастся переписать сохранённое значение HSTS.

Кстати, в целях тестирования устанавливайте небольшое значение директивы max-age — как результат, веб-браузер сам очистит значение HSTS тестируемого домена через указанное время.

Как крайний вариант, можно поменять профиль Firefox.

8.3 Как создать профиль Firefox для тестирования HSTS

Чтобы не попасть в просак с Firefox при тестировании HSTS, вы можете создать специальный профиль.

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

firefox --ProfileManager

А затем запускайте Firefox с помощью команды следующего вида (замените PROFILE на имя профиля, который вы создали предыдущей командой):

firefox -P PROFILE

Например:

firefox -P TestHSTS

Вы можете использовать для этого профили с любым названием, только не используйте профиль «default», иначе теряется всякий смысл.

8.4 Как тестировать HSTS с помощью cURL

Если всё, что вам нужно, проверить, правильно ли настроен HSTS заголовок и правильно ли на него реагирует веб-браузеры и другие веб клиенты, то для этого вполне подойдут утилиты командной строки. Например, curl:

curl --hsts hsts.txt https://hackware.ru
curl --hsts hsts.txt https://youtube.com

В результате работы предыдущей команды, если для указанного сайта включён HSTS, то в файл hsts.txt будет сохранено соответствующее значение, включающее дату истечения срока действия HSTS, например:

# Your HSTS cache. https://curl.se/docs/hsts.html
# This file was generated by libcurl! Edit at your own risk.
hackware.ru "20260104 04:04:52"
.youtube.com "20260104 04:04:55"

8.5 Как тестировать HSTS с помощью wget

Аналогично вы можете тестировать HSTS с помощью wget. Отличие лишь в том, что wget и так сохраняет HSTS записи в файл ~/.wget-hsts. Вы можете анализировать этот файл, либо использовать отдельный файл для тестов:

wget --hsts-file hsts.txt https://suay.site
wget --hsts-file hsts.txt https://youtube.com

Пример содержимого hsts.txt:

# HSTS 1.0 Known Hosts database for GNU Wget.
# Edit at your own risk.
# <hostname>	<port>	<incl. subdomains>	<created>	<max-age>
www.youtube.com	0	0	1735963445	31536000
youtube.com	0	1	1735963445	31536000
suay.site	0	0	1735963403	31536000


Рекомендуется Вам:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *