HTTPQUERY
Русский

Strict-Transport-Security

Применение

Заголовок Strict-Transport-Security — это механизм, лежащий в основе HTTP Strict Transport Security (HSTS). Когда браузер получает этот заголовок по защищённому соединению, он запоминает директиву и автоматически повышает все будущие HTTP-запросы к указанному домену до HTTPS. Если защищённое соединение недоступно, браузер полностью отказывает в доступе, а не откатывается к обычному HTTP.

Этот заголовок учитывается только при доставке по HTTPS. Ответ, отданный по обычному HTTP и содержащий Strict-Transport-Security, игнорируется, поскольку атакующий на сетевом пути способен внедрить или изменить заголовок.

Заголовок принимает три директивы: max-age, includeSubDomains и preload.

max-age

Директива max-age обязательна. Значение задаёт число секунд, в течение которых браузер помнит о необходимости применять HTTPS для домена. Распространённое значение в продакшене — 63072000 (два года). Установка max-age=0 немедленно удаляет запись HSTS из кэша браузера.

includeSubDomains

Директива includeSubDomains распространяет принудительное использование HTTPS на каждый поддомен хоста. Без неё HSTS применяется только к точному домену из ответа. Добавление includeSubDomains не даёт атакующему воспользоваться поддоменом на обычном HTTP для установки Cookie или перенаправления трафика.

preload

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

Пример

Сервер применяет HTTPS в течение двух лет для всех поддоменов и подходит для предзагрузки:

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

Минимальная конфигурация, включающая HSTS на шесть месяцев только для основного домена:

Strict-Transport-Security: max-age=15768000

Очистка записи HSTS сбросом max-age в ноль — полезно при миграциях или тестировании:

Strict-Transport-Security: max-age=0

Диагностика

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

Потеря доступа после включения HSTS с длинным max-age. Как только браузер запомнил политику HSTS, все запросы автоматически повышаются до HTTPS. Вернуться к HTTP невозможно, пока не истечёт max-age или пользователь вручную не удалит запись HSTS. В Chrome откройте chrome://net-internals/#hsts, введите домен в разделе «Delete domain security policies» и удалите запись. В Firefox закройте браузер, отредактируйте SiteSecurityServiceState.txt в папке профиля и удалите строку с доменом.

Поломка поддоменов из-за includeSubDomains. Добавление includeSubDomains принудительно включает HTTPS на каждом поддомене, включая внутренние инструменты, тестовые серверы и устаревшие сервисы без действительного сертификата. Перед включением этой директивы убедитесь, что каждый поддомен отдаёт доверенный TLS-сертификат. Если поддомен сломался, уберите includeSubDomains и повторно разверните заголовок с max-age=0, чтобы очистить закэшированные записи.

Удаление из списка предзагрузки занимает месяцы. Список предзагрузки HSTS поставляется вместе с релизами браузеров, поэтому удаление требует отправки запроса на hstspreload.org, ожидания следующего обновления списка и ожидания, пока это обновление дойдёт до пользователей через обновления версий браузеров. Этот процесс занимает несколько месяцев. Относитесь к preload как к долгосрочному обязательству и убедитесь в полной готовности к HTTPS перед отправкой.

Заголовок HSTS, отправленный по обычному HTTP, игнорируется. Браузеры отбрасывают заголовок Strict-Transport-Security, когда ответ приходит по незашифрованному соединению. Заголовок действует только в HTTPS-ответах. Убедитесь, что заголовок присутствует в HTTPS-ответе, проверив командой: curl -sI https://example.re | grep -i strict.

Ошибки смешанного содержимого после включения HSTS. HSTS повышает страницу до HTTPS, но встроенные ресурсы, всё ещё ссылающиеся на http://-адреса, вызывают предупреждения о смешанном содержимом или блокировки. Проверьте все URL ресурсов (изображения, скрипты, таблицы стилей, конечные точки API) и обновите ссылки на https:// или протоколо-независимые пути. Директива CSP upgrade-insecure-requests делает это автоматически для оставшихся жёстко прописанных HTTP-адресов.

Сбой обновления сертификата приводит к полной недоступности сайта. Просроченный или недействительный сертификат на домене под защитой HSTS приводит к жёсткому отказу без возможности обхода пользователем. Браузеры отказываются показывать сайт или предлагать вариант «всё равно продолжить». Автоматизируйте обновление сертификатов (certbot от Let’s Encrypt делает это по cron-задаче) и отслеживайте сроки их истечения. Настройте оповещения как минимум за 14 дней до истечения.