Зачем это нужно
HTTPS — это шифрование данных между браузером и сервером. Без него пароли, формы и cookies передаются в открытом виде. Любой в той же Wi-Fi сети (кафе, аэропорт, коворкинг) может перехватить эти данные.
Но одного HTTPS недостаточно. Когда пользователь набирает example.ru в адресной строке, браузер сначала делает запрос по HTTP, а уже потом сервер перенаправляет на HTTPS. В этот короткий момент злоумышленник может подменить ответ — это называется атака на понижение протокола (SSL stripping).
HSTS (HTTP Strict Transport Security) решает эту проблему: сервер говорит браузеру «запомни: всегда подключайся ко мне только по HTTPS». После первого визита браузер больше никогда не сделает HTTP-запрос к этому домену.
А HSTS Preload — это следующий уровень. Ваш домен попадает в список, встроенный прямо в браузеры Chrome, Firefox, Safari и Edge. Даже при самом первом визите браузер знает, что нужен только HTTPS. Никакого окна для атаки.
Что потребуется
Прежде чем начать, убедитесь что у вас есть:
- SSL-сертификат — подойдёт бесплатный Let's Encrypt. Большинство хостингов (Timeweb, Beget, REG.RU) выпускают его автоматически.
- Доступ к настройкам веб-сервера — Nginx, Apache или панель хостинга.
- Все поддомены работают по HTTPS — включая www. Если какой-то поддомен не поддерживает HTTPS, после включения HSTS с
includeSubDomainsон станет недоступен.
Шаг 1: Получить SSL-сертификат
Если сертификата ещё нет — получите его. На большинстве хостингов это делается в один клик:
- Зайдите в панель управления хостингом
- Найдите раздел «SSL-сертификаты» или «Безопасность»
- Выпустите бесплатный сертификат Let's Encrypt для вашего домена
- Дождитесь активации (обычно 1–5 минут)
Проверить можно в браузере: откройте ваш сайт через https:// — должен отображаться замок в адресной строке.
Шаг 2: Настроить редирект HTTP → HTTPS
Все запросы по HTTP должны перенаправляться на HTTPS с кодом 301 (постоянный редирект).
Nginx
Добавьте серверный блок для порта 80:
server {
listen 80;
server_name example.ru www.example.ru;
return 301 https://$host$request_uri;
}
Apache (.htaccess)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
На хостинге
Большинство хостингов имеют галочку «Перенаправлять HTTP на HTTPS» в настройках домена. Включите её.
Проверка: откройте http://example.ru — должен автоматически перенаправить на https://example.ru.
Шаг 3: Добавить заголовок HSTS
Теперь нужно отправлять заголовок Strict-Transport-Security в HTTPS-ответах.
Важно: начните с маленького max-age (5 минут), чтобы убедиться что всё работает. Если что-то пойдёт не так — ошибка «забудется» через 5 минут.
Этап 1: Тестирование (5 минут)
Strict-Transport-Security: max-age=300
Этап 2: Проверка (1 день)
Strict-Transport-Security: max-age=86400; includeSubDomains
Этап 3: Продакшн (1 год + preload)
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Переходите к следующему этапу только после того, как убедитесь что текущий работает без проблем.
Как добавить заголовок
Nginx
В блоке server для HTTPS (порт 443):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache
В конфиге виртуального хоста или .htaccess:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Для Apache нужен включённый модуль mod_headers.
Laravel (middleware)
Если вы используете Laravel, можно добавить заголовок в middleware:
if ($request->secure()) {
$response->headers->set(
'Strict-Transport-Security',
'max-age=31536000; includeSubDomains; preload'
);
}
Шаг 4: Проверить заголовок
Убедитесь что заголовок отдаётся правильно. Выполните в терминале:
curl -sI https://example.ru | grep -i strict
Должно вывести:
strict-transport-security: max-age=31536000; includeSubDomains; preload
Или проверьте в браузере: F12 → вкладка «Сеть» → нажмите на запрос к вашему домену → посмотрите заголовки ответа.
Также полезные сервисы для проверки:
- securityheaders.com — покажет оценку всех заголовков безопасности
- SSL Labs — полная проверка SSL/TLS конфигурации
Шаг 5: Отправить домен в HSTS Preload List
Когда всё работает и вы уверены, что HTTPS останется навсегда:
- Откройте hstspreload.org
- Введите ваш домен
- Сайт проверит требования:
- ✅ Валидный SSL-сертификат
- ✅ Редирект HTTP → HTTPS
- ✅ Все поддомены работают по HTTPS
- ✅ Заголовок HSTS с
max-age ≥ 31536000,includeSubDomainsиpreload
- Если всё ОК — нажмите «Submit»
- Домен встанет в очередь и попадёт в список с ближайшим обновлением Chrome (примерно раз в 4 недели)
Важные предупреждения
Прежде чем включать HSTS Preload, учтите:
- Удаление из списка занимает 6–12 месяцев. Если что-то сломается — быстро откатить не получится. Убедитесь что HTTPS работает стабильно.
- includeSubDomains обязателен. Все поддомены (включая те, которые вы могли забыть) должны поддерживать HTTPS. Проверьте DNS-записи.
- Wildcard-сертификат не покрывает вложенные поддомены. Сертификат для
*.example.ruпокроетwww.example.ru, но неapi.staging.example.ru. - Внутренние сервисы тоже затронуты. Если у вас есть
dev.example.ruилиtest.example.ruбез HTTPS — они перестанут работать.
Результат
После настройки ваш сайт получает:
- Защиту от перехвата — данные всегда зашифрованы, даже при первом визите
- Защиту от SSL stripping — невозможно понизить соединение до HTTP
- SEO-бонус — Google учитывает HTTPS как фактор ранжирования
- Доверие пользователей — замок в адресной строке и зелёная оценка в Security Headers
- Соответствие требованиям — 152-ФЗ требует шифрования при передаче персональных данных
На этом сайте (litvinovdev.ru) HSTS Preload работает с момента запуска. Проверить можно на hstspreload.org.