Что такое HSTS?
HSTS (HTTP Strict Transport Security) — механизм веб-безопасности, который сообщает браузерам, что с сайтом нужно взаимодействовать только по HTTPS, а не по HTTP. После получения заголовка HSTS браузер автоматически переводит будущие запросы на HTTPS и отказывается подключаться по обычному HTTP, даже если пользователь явно вводит http://.
Почему HSTS важен
Даже при действующем сертификате SSL остаются уязвимости:
Атака SSL stripping
1. Пользователь вводит «example.com» без https://
2. Атакующий перехватывает первоначальный HTTP-запрос
3. Атакующий обращается к сайту по HTTPS, а пользователю показывает HTTP
4. Пользователь считает соединение защищённым, но атакующий видит весь обмен
HSTS предотвращает это, поскольку браузер не делает первоначальный HTTP-запрос.
Преимущества HSTS
- Предотвращает атаки понижения защиты: откат на HTTP невозможен
- Защищает закладки пользователя: даже старые HTTP-закладки превращаются в HTTPS
- Устраняет смешанное содержимое: подресурсы также принудительно загружаются по HTTPS
- Повышает производительность: перенаправление HTTP→HTTPS не требуется
Синтаксис заголовка HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Директивы
| Директива | Описание |
|---|---|
| max-age | Число секунд, в течение которых нужно помнить HSTS (31536000 = 1 год) |
| includeSubDomains | Применять HSTS ко всем поддоменам |
| preload | Согласие на включение в список предварительной загрузки браузеров |
Реализация HSTS
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Cloudflare
В панели управления Cloudflare откройте раздел сертификатов на границе сети (SSL/TLS → Edge Certificates → HTTP Strict Transport Security) и включите HSTS.
Express.js
const helmet = require('helmet');
app.use(helmet.hsts({
maxAge: 31536000,
includeSubDomains: true,
preload: true
}));
Список предварительной загрузки HSTS
Список предварительной загрузки HSTS — это перечень доменов, зафиксированный в браузерах: к ним следует обращаться только по HTTPS. Он устраняет уязвимость даже самого первого HTTP-запроса.
Требования предварительной загрузки
1. Действующий сертификат SSL
2. Перенаправление всего HTTP на HTTPS
3. Заголовок HSTS со следующими параметрами:
- max-age не менее 31536000 (1 год)
- директива includeSubDomains
- директива preload
4. Все поддомены должны поддерживать HTTPS
Отправка в список предварительной загрузки
1. Проверьте требования: используйте hstspreload.org
2. Отправьте домен: укажите его на hstspreload.org
3. Дождитесь включения: обновление браузеров занимает от нескольких недель до нескольких месяцев
Предупреждения о предварительной загрузке
Предварительная загрузка практически постоянна. Удаление домена из списка занимает месяцы и требует обновления браузеров. Добавляйте домен только если уверены, что все поддомены будут поддерживать HTTPS бессрочно.Проверка HSTS
Инструменты разработчика браузера:1. Откройте вкладку Network в DevTools
2. Загрузите сайт
3. Проверьте в заголовках ответа Strict-Transport-Security
С помощью curl:curl -I https://example.com | grep -i strict
С помощью DomScan:
curl "https://domscan.net/v1/health?domain=example.com"
# Reports hasHSTS in security details
Статус предварительной загрузки:
Проверьте на hstspreload.org, добавлен ли домен в список предварительной загрузки.
Стратегия внедрения HSTS
Фаза 1: короткий max-age
Начните с короткого max-age и проверьте конфигурацию:
Strict-Transport-Security: max-age=300
Если что-то сломается, кэш у пользователей будет действовать всего 5 минут.
Фаза 2: увеличение срока
После подтверждения, что HTTPS работает везде:
Strict-Transport-Security: max-age=86400
Фаза 3: добавление поддоменов
Когда все поддомены поддерживают HTTPS:
Strict-Transport-Security: max-age=2592000; includeSubDomains
Фаза 4: полное внедрение и предварительная загрузка
После нескольких месяцев стабильной работы:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Затем отправьте домен в список предварительной загрузки.
Распространённые проблемы HSTS
Поддомен без HTTPS: includeSubDomains нарушит работу такого поддомена Среды разработки: закэшированный от production HSTS может нарушить локальную разработку Заголовки CDN/прокси: убедитесь, что посредники не удаляют заголовок HSTS Смешанное содержимое: все ресурсы должны использовать HTTPS; HSTS не исправляет встроенные HTTP-ресурсыHSTS необходим для сайтов, работающих с конфиденциальными данными, и настоятельно рекомендуется для всех сайтов с HTTPS.