TLS 1.3 vs TLS 1.2: что изменилось и как правильно мигрировать
TLS 1.3 vs TLS 1.2: что изменилось и как правильно мигрировать
TLS 1.3 вышел в 2018 году (RFC 8446) и в 2026-м используется на 90%+ SSL/TLS проверку-трафика в интернете. Он существенно быстрее, безопаснее и проще TLS 1.2. Если ваш сайт всё ещё работает только на TLS 1.2 — это несколько сотен миллисекунд потерь на каждого пользователя и отставание от best practices. Разберём отличия, покажем миграцию и рассмотрим подводные камни обратной совместимости.
Ключевые отличия TLS 1.3 от TLS 1.2
1. Handshake в одном RTT вместо двух
В TLS 1.2 handshake занимает 2 round-trip time: ClientHello → ServerHello+Certificate → ClientKeyExchange+Finished → Finished. TLS 1.3 объединяет шаги: ClientHello уже содержит key share, сервер отвечает ServerHello+Certificate+Finished за один RTT. При повторных соединениях — 0-RTT, данные уходят вместе с первым пакетом.
2. Удалены устаревшие и слабые cipher suites
В TLS 1.3 остались только 5 AEAD-шифров: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_CCM_SHA256, TLS_AES_128_CCM_8_SHA256. Убраны:
- RSA key exchange (был уязвим к ROBOT attack).
- 3DES, RC4, AES-CBC, DES, MD5.
- Static DH (только ECDHE — всегда forward secrecy).
3. Forward Secrecy по умолчанию
В TLS 1.2 forward secrecy зависит от выбранного cipher — можно было случайно использовать RSA key exchange. В TLS 1.3 это невозможно: все ключи временные и уничтожаются после сессии. Компрометация приватного ключа сервера не даёт расшифровать прошлый трафик.
4. Шифрование метаданных handshake
В TLS 1.2 сертификат сервера передаётся в открытом виде — любой наблюдатель видит, куда вы подключаетесь. В TLS 1.3 после ServerHello шифруется вся дальнейшая часть handshake, включая certificate.
5. Упрощённая конфигурация
Нет больше «правильно ли я подобрал 20 cipher suites» — в 1.3 выбор по умолчанию безопасен.
Скорость: реальный прирост
На новом соединении TLS 1.3 экономит примерно один RTT — 50-150 мс в зависимости от задержки сети. На мобильном LTE разница ощутимая: 200 мс вместо 400 мс до первого байта страницы. При коротких HTTPS-запросах к API документацию (платежи, аналитика) это 20-30% latency.
0-RTT (early data) ещё быстрее, но имеет ограничения: повторное воспроизведение возможно, поэтому нельзя использовать для non-idempotent запросов. nginx поддерживает с версии 1.15.4:
ssl_early_data on;
Миграция nginx с TLS 1.2 на TLS 1.3
Если у вас nginx 1.13+ (с OpenSSL 1.1.1+) — включить TLS 1.3 просто:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off; # в 1.3 клиент выбирает cipher
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';
# TLS 1.3 cipher suites настраиваются отдельной директивой (OpenSSL 1.1.1+)
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off; # TLS 1.3 использует свой механизм resumption
Проверка:
nginx -t && systemctl reload nginx
openssl s_client -connect example.com:443 -tls1_3 < /dev/null 2>&1 | grep "Protocol:"
# должно быть: Protocol: TLSv1.3
Проведите полный аудит через SSL Checker enterno.io — он покажет поддерживаемые версии и оценку конфигурации.
Apache и другие серверы
Apache 2.4.37+:
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite HIGH:!aNULL:!MD5
SSLHonorCipherOrder off
HAProxy 2.0+:
ssl-default-bind-options ssl-min-ver TLSv1.2
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
В Node.js, Python, Go TLS 1.3 поддерживается по умолчанию в современных версиях — обычно ничего настраивать не нужно.
Обратная совместимость
TLS 1.3 не поддерживают:
- Android < 10 (частично — начиная с 6, но без ECH и 0-RTT).
- iOS < 12.2.
- Java < 11 (в Java 8 поддержка появилась в 8u261+).
- Старые IoT-устройства с OpenSSL 1.0.2.
- Firefox < 63, Chrome < 70, Safari < 12.
Решение — держать одновременно TLS 1.2 и 1.3. TLS 1.2 останется с нами ещё минимум 5-10 лет как fallback. Отключать TLS 1.2 стоит только в API, где вы контролируете всех клиентов.
Что отключить обязательно
TLS 1.0 и 1.1 — устаревшие, PCI DSS с 2018 года требует их отключения. Чёрный список:
# НЕ использовать
ssl_protocols TLSv1 TLSv1.1;
ssl_ciphers DES-CBC-SHA; # DES
ssl_ciphers RC4-SHA; # RC4
ssl_ciphers NULL-SHA; # Без шифрования
ssl_ciphers EXPORT-RSA-RC4; # Export-grade
Подробнее — «Слабые cipher suites».
0-RTT: польза и риски
0-RTT позволяет клиенту прислать данные в первом же пакете, не дожидаясь handshake. Прирост — ещё один RTT. Но 0-RTT не имеет forward secrecy для early data, и атакующий может воспроизвести пакет (replay). Поэтому:
- Разрешайте 0-RTT только для GET-запросов без побочных эффектов.
- Никогда — для POST/PUT, платежей, операций авторизации.
- В nginx используйте переменную
$ssl_early_dataдля маркировки запросов и фильтрации в приложении.
Часто задаваемые вопросы
Можно ли полностью отключить TLS 1.2?
Для публичного сайта — нет, потеряете до 5% пользователей со старыми устройствами. Для внутренних API — можно, если контролируете клиенты.
TLS 1.3 и HTTP/3?
HTTP/3 (QUIC) встроен с TLS 1.3 на уровне протокола. Это ещё один RTT выигрыш и улучшенное поведение на плохих сетях.
Где проверить, какие версии использует мой сервер?
SSL Checker enterno.io, SSL Labs, или nmap --script ssl-enum-ciphers -p 443 example.com.
TLS 1.3 работает с моим старым wildcard-сертификатом?
Да. TLS 1.3 — это протокол, а сертификат — отдельная вещь. Любой X.509-сертификат (включая wildcard и SAN) работает одинаково. См. wildcard vs SAN.
Заключение
Миграция на TLS 1.3 — одна из самых дешёвых оптимизаций: пять строк в nginx.conf дают прирост скорости и безопасности. Отключать TLS 1.2 пока рано, но 1.0 и 1.1 уберите сегодня же. SSL Checker enterno.io покажет, какие версии сейчас поддерживает ваш сервер, и оценит конфигурацию. Monitors зафиксирует, если после деплоя TLS 1.3 случайно выключился.
TLS 1.3 — RFC 8446. TLS 1.2 — RFC 5246. Mozilla TLS Config — ssl-config.mozilla.org.
Проверьте ваш сайт прямо сейчас
Проверить →