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

Конфигурация с пояснениями и проверками
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 проверяется отдельно.