← Все статьи

Как настроить HTTPS + HSTS Preload для сайта: пошаговое руководство

Пошаговая инструкция: SSL-сертификат, редирект на HTTPS, заголовок HSTS и включение в Preload List браузеров. С примерами для Nginx, Apache и Laravel.

Зачем это нужно

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. Никакого окна для атаки.

Что потребуется

Прежде чем начать, убедитесь что у вас есть:

  1. SSL-сертификат — подойдёт бесплатный Let's Encrypt. Большинство хостингов (Timeweb, Beget, REG.RU) выпускают его автоматически.
  2. Доступ к настройкам веб-сервера — Nginx, Apache или панель хостинга.
  3. Все поддомены работают по HTTPS — включая www. Если какой-то поддомен не поддерживает HTTPS, после включения HSTS с includeSubDomains он станет недоступен.

Шаг 1: Получить SSL-сертификат

Если сертификата ещё нет — получите его. На большинстве хостингов это делается в один клик:

  1. Зайдите в панель управления хостингом
  2. Найдите раздел «SSL-сертификаты» или «Безопасность»
  3. Выпустите бесплатный сертификат Let's Encrypt для вашего домена
  4. Дождитесь активации (обычно 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 останется навсегда:

  1. Откройте hstspreload.org
  2. Введите ваш домен
  3. Сайт проверит требования:
    • ✅ Валидный SSL-сертификат
    • ✅ Редирект HTTP → HTTPS
    • ✅ Все поддомены работают по HTTPS
    • ✅ Заголовок HSTS с max-age ≥ 31536000, includeSubDomains и preload
  4. Если всё ОК — нажмите «Submit»
  5. Домен встанет в очередь и попадёт в список с ближайшим обновлением 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.

← Все статьи