Перейти к содержанию
Innovialabs

Безопасная настройка TLS: протоколы, шифры и оценка A+ в SSL Labs

Продвинутое4 мин

Коротко

Оставьте только TLS 1.2 и 1.3, только обмен ключами ECDHE с AEAD-шифрами, отдавайте полную цепочку сертификатов и добавьте HSTS — эта комбинация убирает типичные замечания SSL Labs и является стандартным путём к оценке A+.

Коротко

Надёжная настройка TLS сводится к четырём решениям:

  1. Протоколы: только TLS 1.2 и TLS 1.3. SSL 2/3, TLS 1.0 и TLS 1.1 официально устарели и должны быть выключены.
  2. Шифры: только наборы с обменом ключами ECDHE (forward secrecy) и AEAD-шифрованием (AES-GCM, ChaCha20-Poly1305).
  3. Сертификат: полная цепочка (конечный плюс промежуточные) и современный ключ — ECDSA P-256 или RSA не короче 2048 бит.
  4. HSTS: заголовок Strict-Transport-Security с долгим сроком. Без него SSL Labs не ставит A+.

Что отключить и почему

ОтключитьПричина
SSLv2, SSLv3Взломаны известными атаками (POODLE и другие)
TLS 1.0, TLS 1.1Устарели, опираются на слабые конструкции; SSL Labs ограничивает оценку уровнем B
RC4, 3DES, NULL, EXPORT, анонимные наборыСлабое или нулевое шифрование либо нет аутентификации
Статический обмен ключами RSA (AES128-GCM-SHA256 и т. п.)Нет forward secrecy
Наборы в режиме CBCВ современных библиотеках не взломаны, но исторически хрупкие; SSL Labs помечает их как слабые

В TLS 1.3 всё перечисленное удалено из протокола, поэтому его список шифров настраивать не нужно. Всё сказанное выше относится к TLS 1.2.

Forward secrecy

С ECDHE каждое соединение использует временную пару ключей, которая затем уничтожается. Если закрытый ключ сервера украдут позже, записанный ранее трафик всё равно не расшифровать.

Две вещи незаметно ослабляют эту защиту:

  • Статические RSA-наборы, оставленные в списке «для старых клиентов».
  • Session tickets, зашифрованные ключом, который никогда не меняется. Если вы не ротируете ключи тикетов, выставьте ssl_session_tickets off и полагайтесь на кэш сессий.

OCSP stapling

Браузер может проверять, не отозван ли сертификат. При OCSP stapling сервер сам получает у CA подписанный статус и прикладывает его к рукопожатию: браузеру не нужен отдельный запрос, а приватность пользователя сохраняется.

Оговорка: часть удостоверяющих центров, включая Let's Encrypt, отказалась от OCSP в пользу списков отзыва. Если в вашем сертификате нет OCSP-адреса, stapling неприменим, nginx запишет предупреждение в лог, а SSL Labs просто покажет его как недоступный — на оценку это не влияет.

Рабочая конфигурация nginx

За основу взят профиль «intermediate», который продвигает Mozilla: безопасно и совместимо практически со всеми используемыми сегодня браузерами.

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # Только если ваш CA ещё поддерживает OCSP
    # ssl_stapling on;
    # ssl_stapling_verify on;
    # resolver 1.1.1.1 8.8.8.8 valid=300s;

    add_header Strict-Transport-Security "max-age=63072000" always;
}

ssl_prefer_server_ciphers off выбран сознательно: все наборы в списке надёжные, и клиент может взять самый быстрый для своего железа (на многих телефонах это ChaCha20). Чтобы получить конфигурацию под точную версию вашего сервера, используйте Mozilla SSL Configuration Generator.

Применить и проверить:

nginx -t && systemctl reload nginx
openssl s_client -connect example.com:443 -tls1_1   # должно завершиться ошибкой
openssl s_client -connect example.com:443 -tls1_3   # должно подключиться

Как читать отчёт SSL Labs

Запустите тест на ssllabs.com и пройдите отчёт сверху вниз:

  • Summary. Оценка и жёлтые и красные примечания. Именно они говорят, что ограничило оценку.
  • Certificate. Ищите «Chain issues: Incomplete» — лечится отдачей fullchain.pem, а не только конечного сертификата.
  • Configuration → Protocols. Всё, кроме TLS 1.2 и 1.3, помеченное «Yes», нужно выключить.
  • Cipher Suites. Строки с пометкой WEAK или INSECURE берутся из вашего ssl_ciphers.
  • Handshake Simulation. Показывает, какие реальные клиенты подключаются и с какими параметрами. Проверьте, что не отрезали нужную вам аудиторию.
  • Protocol Details. Проверьте Forward Secrecy, OCSP stapling и Strict Transport Security.

Частые ошибки

  • Правится один блок server, а другой блок по умолчанию продолжает отдавать старые настройки.
  • TLS завершается на балансировщике или CDN со своими настройками — усиливать нужно там, а не только на origin.
  • Короткий max-age HSTS поставлен для теста, и его забыли увеличить.
  • nginx не перезагружается после того, как скрипт продления обновил файлы сертификата.

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

Только на очень старых ОС и браузерах, которые годами не получали обновлений. Если у вас специфическая аудитория со старыми устройствами, посмотрите раздел Handshake Simulation и данные аналитики.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.