HTTPS, TLS и безопасность конфигурации
Связь с предыдущими темами
Ранее вы настроили server-блоки, правила location, научились отдавать статику и проксировать запросы в приложение (в том числе через upstream). Теперь добавим обязательный для продакшена слой: HTTPS.
На практике это означает, что Nginx будет:
принимать зашифрованные соединения на 443;
предъявлять клиенту сертификат;
расшифровывать трафик и дальше либо отдавать статику, либо проксировать запросы в приложение;
применять дополнительные меры безопасности конфигурации, чтобы снизить риски.!Понимание, где заканчивается TLS и где начинается обычный HTTP
Что такое HTTPS и что такое TLS
HTTPS — это HTTP поверх шифрования.
TLS — криптографический протокол, который обеспечивает:шифрование трафика;
целостность (защита от незаметной подмены данных);
аутентификацию сервера (клиент проверяет, что домен действительно обслуживает тот, кто предъявил сертификат).В терминах Nginx: HTTPS включается в server { ... }, где вы добавляете listen 443 ssl; и указываете сертификат и приватный ключ.
Сертификат, ключ и цепочка доверия
Чтобы клиент доверял вашему сайту, ему нужно проверить сертификат.
Основные элементы
Приватный ключ — секретный файл на сервере. Он доказывает, что вы владеете сертификатом.
Сертификат — публичный файл, который Nginx отдаёт клиенту. В сертификате указаны домены (например, example.com и www.example.com).
Цепочка сертификатов — дополнительные сертификаты (обычно промежуточные), которые помогают клиенту связать ваш сертификат с доверенным центром сертификации.Практическое правило: приватный ключ должен быть доступен только root и пользователю, под которым Nginx читает ключ, и не должен попадать в репозитории.
!Визуально объясняет, почему нужен fullchain и как работает доверие
Где взять сертификат
Основные варианты:
сертификат от публичного CA (чаще всего Let’s Encrypt);
корпоративный CA (внутренние инфраструктуры);
самоподписанный сертификат (подходит для тестов, но браузер будет предупреждать).Рекомендованный вариант для продакшена: Let’s Encrypt.
Ссылки:
Let's Encrypt
CertbotКак Nginx выбирает правильный сертификат
Когда на одном IP обслуживаются несколько доменов, клиент при установлении TLS-соединения сообщает имя сайта через расширение SNI.
Практический вывод:
в Nginx вы создаёте отдельные server-блоки на listen 443 ssl; с разными server_name и сертификатами;
нужен также default_server на 443, чтобы корректно обработать неожиданные домены.Включаем HTTPS в Nginx: минимальный рабочий пример
Ниже — минимальная конфигурация для домена example.com.
Что важно:
ssl_certificate обычно указывает на fullchain.pem, чтобы клиент получил цепочку.
ssl_certificate_key указывает на приватный ключ.Проверка и применение:
Редирект с HTTP на HTTPS и ACME-челлендж
Зачем нужен редирект
Чтобы пользователи всегда работали по HTTPS, обычно делают отдельный server на 80, который возвращает редирект.
Важный нюанс для Let’s Encrypt
Если вы получаете сертификат через HTTP-валидацию (http-01), CA должен суметь сходить по пути /.well-known/acme-challenge/... по HTTP.
Частый практический подход: разрешить этот путь на 80, а всё остальное редиректить.
Получение сертификата Let’s Encrypt через Certbot (пример для Ubuntu/Debian)
На практике удобнее всего использовать Certbot, который:
получает сертификаты;
настраивает автопродление;
может автоматически обновлять конфигурацию Nginx.Пример установки (вариант через snap часто рекомендован самим Certbot):
Получение сертификата с автоматической настройкой Nginx:
Проверка таймера продления:
Ссылки:
Инструкции Certbot для NginxРекомендованные настройки TLS: протоколы, шифры, сессии
TLS-настройки меняются со временем. Вместо того чтобы копировать случайные сниппеты, используйте актуальные рекомендации.
Практически безопасный подход:
включить современные версии протокола;
не включать устаревшие и небезопасные варианты;
включить HTTP/2 (если вам нужно) для ускорения загрузки на HTTPS.Хороший источник для генерации конфигурации: Mozilla SSL Configuration Generator.
Пример набора директив, который часто используют как отдельный подключаемый файл (проверьте актуальность в вашем окружении):
Комментарии по смыслу:
ssl_protocols ограничивает версии TLS.
ssl_session_cache и ssl_session_timeout помогают повторным подключениям быть быстрее.
http2 (в listen) включает HTTP/2 на TLS-соединении.HSTS и безопасные HTTP-заголовки
TLS шифрует соединение, но полезно добавить защитные заголовки, которые помогают браузеру безопаснее интерпретировать контент.
HSTS
HSTS говорит браузеру: в следующий раз ходи на этот домен только по HTTPS.
Практические предостережения:
включайте HSTS только после того, как вы уверены, что HTTPS работает стабильно;
более строгий вариант с includeSubDomains может затронуть поддомены;
параметр preload требует отдельного процесса добавления домена в списки браузеров.Документация: Директива add_header
Базовый набор защитных заголовков
Один из практичных стартовых наборов:
Что это даёт:
X-Content-Type-Options снижает риск опасного автоопределения типов.
X-Frame-Options защищает от встраивания сайта в iframe (кликджекинг) в простых сценариях.
Referrer-Policy уменьшает утечки URL через Referer.Про Content Security Policy (CSP): это мощный заголовок, но его лучше вводить отдельно и аккуратно, потому что он часто ломает фронтенд при неправильной политике.
Безопасность конфигурации Nginx: практический чеклист
Закрыть неожиданные домены: default_server
Как и для 80, полезно иметь default_server и на 443, чтобы запросы с чужими Host не попадали в «случайный» виртуальный хост.
444 — специальный код Nginx: соединение закрывается без ответа.
Спрятать версию Nginx
Документация: Директива server_tokens
Защитить приватный ключ и файлы сертификатов
Типовые рекомендации:
права на приватный ключ: 600 (владелец root);
каталог с ключами не должен быть доступен на чтение другим пользователям;
приватный ключ не должен попадать в root сайта.Проверить права:
Не отдавать лишнее из файловой системы
Даже если у вас статика, полезно явно запретить доступ к скрытым файлам и служебным каталогам.
Пример запрета для файлов, начинающихся с точки:
Пояснение:
регулярное выражение ловит /.git, /.env и подобное;
исключение для /.well-known оставляет возможность ACME-валидации.Ограничить размеры и таймауты (как минимум на старте)
Это не «панацея», но уменьшает риск тривиальных злоупотреблений.
Примеры:
Документация:
Директива client_max_body_sizeПроверка HTTPS и диагностика
Быстрая проверка через curl
Проверить, что сайт отвечает по HTTPS:
Проверить редирект с HTTP на HTTPS:
Проверка сертификата и SNI через openssl
На что смотреть:
что отдается правильный сертификат для нужного домена;
есть ли ошибки в цепочке;
какая версия TLS и набор шифров согласовались.Где искать причины ошибок
синтаксические ошибки: sudo nginx -t;
ошибки загрузки ключа и сертификата: sudo tail -n 200 /var/log/nginx/error.log;
ошибки доступа к файлам (права, SELinux) часто проявляются как проблемы чтения ssl_certificate_key.Документация по логам: Модуль логирования Nginx
Итоги
HTTPS в Nginx включается через listen 443 ssl; и указание ssl_certificate и ssl_certificate_key.
Для продакшена удобнее и безопаснее получать сертификаты через Let’s Encrypt и Certbot.
Важно понимать SNI, если на одном сервере несколько доменов.
Безопасная эксплуатация — это не только TLS, но и default_server, server_tokens off, защита скрытых файлов, аккуратные лимиты и корректные права на ключ.
Диагностика HTTPS обычно сводится к nginx -t, error.log, curl и openssl s_client.