Загрузка...
Загрузка...
Пошаговая настройка HSTS для принудительного HTTPS. max-age, includeSubDomains, preload. Nginx, Apache, Cloudflare. Проверка и отладка.
Сравнение типов SSL-сертификатов: DV, OV, EV, Wildcard, Multi-Domain. Как выбрать подходящий сертификат для вашего проекта. Стоимость, сроки выдачи, особенности.
БезопасностьПодробное руководство по типичным ошибкам SSL: ERR_CERT_AUTHORITY_INVALID, mixed content, истёкший сертификат, проблемы цепочки. Диагностика и исправление для веб-мастеров.
БезопасностьВсё о SSL/TLS сертификатах: типы, получение, настройка, обновление. Let's Encrypt, Wildcard, EV-сертификаты. Практическое руководство для веб-разработчиков.
БезопасностьПолное руководство по CSP: все директивы, nonce, hash, report-uri, strict-dynamic. Пошаговое внедрение, отладка, примеры для популярных фреймворков.
Поделитесь с коллегами или изучите другие материалы блога
HTTP Strict Transport Security (HSTS) — механизм, который указывает браузеру всегда использовать HTTPS при обращении к вашему домену. Без HSTS первый запрос пользователя (например, при вводе example.com без https://) идёт по HTTP и уязвим для атак «человек посередине». HSTS устраняет это окно уязвимости.
Сценарий атаки:
example.com в адресной строке.С HSTS браузер «помнит», что домен требует HTTPS, и преобразует HTTP-запросы в HTTPS ещё до отправки. Первый визит по-прежнему уязвим, но все последующие — защищены.
Проверить настройку HSTS и SSL можно с помощью анализатора заголовков безопасности и SSL Checker на rechecker.ru.
Strict-Transport-Security: max-age=<seconds>; includeSubDomains; preload
| Параметр | Описание |
|---|---|
max-age | Время в секундах, сколько браузер помнит политику. Рекомендуется 31536000 (1 год) |
includeSubDomains | Распространить политику на все поддомены |
preload | Подсказка для включения в HSTS preload list браузеров |
Если включить HSTS при нерабочем HTTPS, пользователи не смогут обойти блокировку браузера. Отзыв из preload-списка занимает месяцы.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Параметр always нужен, чтобы заголовок отдавался и при кодах 4xx/5xx.
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Требуется модуль mod_headers:
LoadModule headers_module modules/mod_headers.so
app.use((req, res, next) => {
if (req.secure) {
res.setHeader(
'Strict-Transport-Security',
'max-age=31536000; includeSubDomains; preload'
);
}
next();
});
При использовании reverse proxy (Nginx перед Node) проверяйте заголовок X-Forwarded-Proto:
const isSecure = req.secure || req.get('X-Forwarded-Proto') === 'https';
if (isSecure) {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
}
В панели Cloudflare: SSL/TLS → Edge Certificates → включить «HSTS» и задать max-age. Preload включается отдельной опцией.
Preload — список доменов, встроенный в браузеры. Для них HTTPS обязателен с первого визита, без единого HTTP-запроса.
Шаги:
max-age не менее 31536000 и includeSubDomains.preload в заголовок.Важно: отзыв из preload занимает несколько месяцев. Убедитесь, что HTTPS будет работать стабильно.
curl -I https://example.com
Ожидаемый заголовок:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Онлайн-проверка: Security Headers — покажет все заголовки безопасности, включая HSTS.
Включайте includeSubDomains, только если все поддомены (www, api, cdn, admin и т.д.) обслуживаются по HTTPS. Иначе пользователи не смогут открыть поддомен по HTTP.
Проверьте поддомены:
curl -I https://www.example.com
curl -I https://api.example.com
HSTS дополняет, но не заменяет:
Для большинства сайтов:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Убедитесь, что все поддомены поддерживают HTTPS, затем добавьте домен в preload на hstspreload.org.