Категория: Веб-сервер и инфраструктураОбновлено 2026-10-18

HSTS (строгая транспортная безопасность HTTP)

HSTS (HTTP Strict Transport Security, строгая транспортная безопасность HTTP) это политика из RFC 6797, которую передают в заголовке ответа Strict-Transport-Security. Она велит браузеру обращаться к сайту только по HTTPS заданное число секунд, автоматически заменять http-ссылки и не давать пользователю игнорировать ошибки сертификата.

Что делает заголовок Strict-Transport-Security

HSTS описан в RFC 6797. Сервер отправляет заголовок по HTTPS, и браузер запоминает хост как доступный только по HTTPS. У заголовка есть обязательная директива max-age, то есть число секунд хранения политики, и необязательная includeSubDomains, которая распространяет политику на все поддомены.

Для известного HSTS-хоста, как объясняет MDN, браузер переписывает адреса http на https, меняя порт 80 на 443, а при проблеме с сертификатом пользователь не может продолжить. Если заголовок пришёл по обычному HTTP, браузер его игнорирует, а IP-адрес не может быть HSTS-хостом.

Каждый ответ с заголовком сдвигает срок действия на текущее время плюс max-age. Одна слабость остаётся: пока браузер не сделал хотя бы одно защищённое обращение и не получил заголовок, защиты нет. preload в RFC не входит. Это отдельный список, который ведут браузеры, и он закрывает дыру первого визита.

Как настроить и проверить HSTS в nginx

Отправляйте заголовок только из HTTPS-блока server, а HTTP-блок оставьте простым редиректом без него, как советует MDN. Указывайте параметр always: согласно документации nginx, без него add_header пропускает такие ответы, как 404 и 500.

server {
    listen 80;
    server_name example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    # Этап 1: пять минут. Позже увеличьте, см. раздел про внедрение.
    add_header Strict-Transport-Security "max-age=300; includeSubDomains" always;
}

Проверьте конфигурацию и перезагрузите службу командой sudo nginx -t && sudo systemctl reload nginx, затем проверьте с другой машины:

curl -sI https://example.com/ | grep -i strict-transport-security
curl -sI https://example.com/no-such-page | grep -i strict-transport-security
curl -sI http://example.com/

Первые две команды должны вывести заголовок. Третья должна показать редирект 301 без заголовка.

Порядок внедрения и риски длинного max-age и preload

Ошибку трудно исправить быстро. По данным MDN, max-age=0 срабатывает только после того, как браузер сделает защищённый запрос, поэтому отменить HSTS по обычному HTTP нельзя. Если поддомен или сертификат сломается, пока в кэше длинная политика, пользователи окажутся заблокированы без возможности продолжить.

Рекомендации hstspreload.org задают такой порядок:

  1. Убедитесь, что все поддомены работают по HTTPS, включая внутренние, не видимые снаружи.
  2. Включите max-age=300; includeSubDomains, затем увеличьте до 604800 (неделя), затем до 2592000 (месяц).
  3. На каждом этапе исправляйте поломки и ждите полный max-age, прежде чем идти дальше.

Для preload нужны действительный сертификат, редирект с HTTP на HTTPS, max-age не меньше 31536000, а также includeSubDomains и preload. Сайт предупреждает, что включение в список нелегко отменить, а удаление может дойти до пользователей месяцами. Не добавляйте preload, если не уверены, что все поддомены будут поддерживать HTTPS на долгий срок.

Место HSTS в укреплении сервера

HSTS опирается на рабочий TLS: он не заменяет хороший сертификат, современные настройки протоколов и продление. Это один из заголовков безопасности, который соблюдает браузер, а не сервер, поэтому он помогает только тем посетителям, кто уже заходил к вам по защищённому соединению или чей браузер знает ваш домен из списка preload.

Базовый фрагмент из руководства по безопасности nginx показывает конечное состояние: max-age на два года и preload. Приходите к нему поэтапно, а не вставляйте в первый же день. Поскольку HSTS превращает ошибки сертификата в жёсткий отказ, просроченный сертификат отключает сайт для всех, поэтому следите за сроком действия, как объясняет статья про 45-дневные сертификаты Let's Encrypt. Добавьте разбор журналов из руководства по мониторингу и отметьте пункт в чек-листе безопасности VPS. Обратный прокси или CDN перед сайтом тоже должен отправлять заголовок.

Связанные термины: Заголовки безопасности, TLS / SSL, nginx, ssl_protocols, Обратный прокси.

Часто задаваемые вопросы

Что означает HSTS?

HSTS расшифровывается как HTTP Strict Transport Security. Это политика из RFC 6797, которую передают в заголовке ответа Strict-Transport-Security, чтобы браузер использовал для хоста только HTTPS.

Какой max-age указывать для HSTS?

Начните с короткого значения, например 300 секунд, и поэтапно увеличивайте до недели и месяца, как советует hstspreload.org. Для preload нужно не меньше 31536000 секунд (один год).

Как проверить, что HSTS работает?

Выполните curl -sI https://example.com/ и найдите заголовок Strict-Transport-Security, затем повторите для несуществующей страницы, чтобы убедиться, что параметр always работает. Обычный HTTP-адрес должен только перенаправлять и не содержать заголовка.

Можно ли отключить HSTS после включения?

Отправьте max-age=0 по HTTPS, но по данным MDN это сработает только после того, как каждый браузер сделает защищённый запрос. Удаление из списка preload в браузерах может занять месяцы, поэтому не используйте preload необдуманно.

Защищает ли HSTS первое посещение сайта?

Нет. Браузер узнаёт политику только после защищённого ответа, поэтому первый запрос можно атаковать. По данным MDN, это смягчает preload.

Хотите увидеть, в каком состоянии ваш сервер?

Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.

Получить бесплатную проверку сервераОткрыть Security Lab