Перейти к содержимому
EN
← Все статьи

Настройка TLS в nginx: конфиг и путь к оценке A+

Коротко:

Хорошая TLS-конфигурация nginx начинается с полной цепочки сертификата, актуальных TLS 1.2/1.3, корректного имени и повторяемой внешней проверки. Оценка A+ в конкретном тесте зависит также от HSTS, версии ПО и внешнего TLS-терминатора. Один фрагмент конфига сам по себе оценку не гарантирует.

Серверная стойка с защищённым TLS-шлюзом
Оценку TLS определяет наблюдаемая конфигурация публичного адреса.

Если перед nginx стоит CDN или балансировщик, сканер видит именно его TLS-политику. Поэтому сначала определите публичную точку завершения TLS и проверьте её сертификат через s_client. Конфигурация ниже — базовый шаблон для nginx, который сам принимает HTTPS; пути и политика HSTS требуют адаптации. Синтаксис сверяйте с руководством nginx и SSL-модулем.

Что определяет результат внешней проверки

ПроверкаТипичная проблемаКак подтвердить
Имя и цепочкаНеверный SAN или отсутствует intermediateВнешний TLS-клиент и SSL-тест
ПротоколыУстаревшая версия TLS включена на edgeПроба каждой разрешённой версии
ШифрыСлабые наборы или старый OpenSSLСканер и версия библиотеки
HSTSЗаголовок отсутствует или опасно включён без готовностиHTTP-ответ по всему домену

Не копируйте случайный длинный список шифров из старой статьи. Mozilla SSL Configuration Generator выдаёт профиль с учётом версии nginx/OpenSSL и совместимости клиентов. Новая версия nginx может иметь хорошие значения по умолчанию, но реальную конфигурацию с include и настройкой CDN проверяют отдельно. Для диагностики ошибки клиента используйте справочник curl 35/60.

Путь TLS от клиента через прокси к серверу
Проверять нужно внешний TLS-терминатор, а не только конфиг nginx.

Конфигурация с пояснениями и проверками

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    add_header Strict-Transport-Security "max-age=300" always;
    # location / { ... } — маршруты приложения остаются проектными.
}

fullchain.pem содержит leaf и нужные intermediate; закрытый ключ защищайте правами файловой системы. ssl_protocols ограничивает версии; поддержка TLS 1.3 зависит от сборки OpenSSL. Короткий max-age=300 в примере — осторожный этап проверки HSTS, а не универсальное значение для A+. Увеличивайте срок лишь после проверки всех поддоменов и схем доступа; includeSubDomains и preload без инвентаризации могут запереть пользователей на неготовых хостах. Детали поведения HSTS см. в MDN.

Перед reload выполните nginx -t и сохраните прежний рабочий конфиг для отката. После reload снимите сертификат и заголовки снаружи, включая другие заголовки безопасности. Если тест видит CDN, настройте соответствующий параметр там; исправление origin-конфига не изменит публичную оценку. Проверяйте не только главную страницу, но и IPv6-адрес, альтернативные hostnames и цепочку редиректов по DNS-ответам.

План проверки до и после

nginx -t
curl -sSI https://example.com/ | sed -n '1,25p'
openssl s_client -connect example.com:443 -servername example.com -tls1_2 </dev/null
openssl s_client -connect example.com:443 -servername example.com -tls1_3 </dev/null

Выполните одинаковый внешний тест до и после изменения и сохраните результат. Если HSTS или DNS обновляется через CDN, дождитесь применения его конфигурации. Рейтинг стороннего сервиса меняется по собственной методике; корректнее говорить «проверено сканером X в дату Y», чем обещать A+ для любого домена. Текущий материал не содержит сохранённой пары оценок «до/после» для одного хоста и не выдаёт пример за измерение enterno.io.

Что видно на публичном TLS enterno.io

Контрольный тест 13 ноября 2026 года подтвердил успешное рукопожатие как по TLS 1.2, так и по TLS 1.3. Для TLS 1.2 OpenSSL показал ECDHE-RSA-AES128-GCM-SHA256, для TLS 1.3 — TLS_AES_128_GCM_SHA256; оба раза Verify return code: 0 (ok). Заголовочный запрос вернул HTTP/2 200, но в сохранённой выборке не было HSTS. Это данные публичного TLS-терминатора enterno.io, а не доказательство оценки A+ или конфигурации origin nginx. Полные команды и выбранные строки лежат в data.json статьи об OCSP.

Как сделан материал

Директивы сверены с документацией nginx, подход к профилям — с Mozilla. Поисковая выдача изучена через SerpAPI; Wordstat региона 225 не вернул оценку для точной фразы ssl a+ nginx, а широкая настройка ssl nginx показала 52. Эти числа помогают выбрать заголовок и не доказывают качество конфигурации.

Частые вопросы

Почему хороший конфиг nginx не дал A+?

Публичный тест может видеть CDN, другой IP, устаревшую сборку, неполную цепочку или иную HSTS-политику.

Нужно ли включать HSTS preload?

Только после инвентаризации всех поддоменов и понимания длительных последствий. Для первичной проверки он не нужен.

Достаточно ли разрешить TLS 1.3?

Нет. Нужны поддержка клиентов, корректный сертификат, цепочка и проверка внешнего адреса; TLS 1.2 часто оставляют для совместимости.

Где менять TLS, если стоит CDN?

На публичном TLS-терминаторе. Связь CDN с origin проверяется отдельно.

Источники

Проверьте ваш сайт прямо сейчас

Проверить SSL своего сайта →
Другие статьи: SSL/TLS
SSL/TLS
Сертификат Минцифры: как установить и вернуть доступ к банкам
31.08.2026 · 4 876 просм.
SSL/TLS
Подключение не защищено: что значит и как исправить ошибку
23.09.2026 · 4 108 просм.
SSL/TLS
SSL Handshake Failed: причины ошибки и пошаговая диагностика
15.04.2026 · 3 934 просм.
SSL/TLS
ERR_CERT_AUTHORITY_INVALID: что значит и как исправить ошибку
13.07.2026 · 3 774 просм.