Безопасная настройка TLS: протоколы, шифры и оценка A+ в SSL Labs
Продвинутое4 минРедакция Innovialabs
Коротко
Оставьте только TLS 1.2 и 1.3, только обмен ключами ECDHE с AEAD-шифрами, отдавайте полную цепочку сертификатов и добавьте HSTS — эта комбинация убирает типичные замечания SSL Labs и является стандартным путём к оценке A+.
Коротко
Надёжная настройка TLS сводится к четырём решениям:
- Протоколы: только TLS 1.2 и TLS 1.3. SSL 2/3, TLS 1.0 и TLS 1.1 официально устарели и должны быть выключены.
- Шифры: только наборы с обменом ключами ECDHE (forward secrecy) и AEAD-шифрованием (AES-GCM, ChaCha20-Poly1305).
- Сертификат: полная цепочка (конечный плюс промежуточные) и современный ключ — ECDSA P-256 или RSA не короче 2048 бит.
- 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-ageHSTS поставлен для теста, и его забыли увеличить. - nginx не перезагружается после того, как скрипт продления обновил файлы сертификата.