TLS 1.3: что изменилось и почему это важно
TLS 1.3 — последняя версия протокола Transport Layer Security, утверждённая в RFC 8446 в августе 2018 года. Это самое значительное обновление протокола TLS с момента его создания: удалены устаревшие криптографические алгоритмы, упрощено рукопожатие и значительно улучшены безопасность и производительность. Для всех, кто управляет веб-сервисами, понимание TLS 1.3 необходимо для поддержания безопасной и быстрой инфраструктуры.
Рукопожатие TLS: сравнение 1.2 и 1.3
Самое заметное улучшение TLS 1.3 — сокращённая задержка рукопожатия. TLS 1.2 требует два круговых обхода (2-RTT) для установления защищённого соединения. TLS 1.3 сокращает это до одного (1-RTT) и поддерживает нулевой (0-RTT) для повторных соединений.
Рукопожатие TLS 1.2 (2-RTT)
Клиент → Сервер: ClientHello (поддерживаемые шифры, random)
Сервер → Клиент: ServerHello, Certificate, ServerKeyExchange, ServerHelloDone
Клиент → Сервер: ClientKeyExchange, ChangeCipherSpec, Finished
Сервер → Клиент: ChangeCipherSpec, Finished
[Начало передачи данных приложения]
Рукопожатие TLS 1.3 (1-RTT)
Клиент → Сервер: ClientHello + KeyShare (предполагаемые параметры обмена ключами)
Сервер → Клиент: ServerHello + KeyShare, EncryptedExtensions, Certificate, CertificateVerify, Finished
Клиент → Сервер: Finished
[Данные приложения — на один RTT быстрее]
Ключевое различие: в TLS 1.3 клиент отправляет параметры обмена ключами уже в первом сообщении, предполагая выбор сервера. Если предположение верно (что обычно так), рукопожатие завершается за один круговой обход.
Возобновление 0-RTT
При повторном подключении к серверу TLS 1.3 поддерживает 0-RTT (ранние данные). Клиент отправляет зашифрованные данные уже в первом сообщении, до завершения рукопожатия:
Клиент → Сервер: ClientHello + KeyShare + EarlyData (зашифровано PSK)
Сервер → Клиент: ServerHello + KeyShare + Finished
[Сервер обрабатывает ранние данные немедленно]
Это полностью устраняет задержку рукопожатия для повторных посетителей. Однако данные 0-RTT уязвимы к атакам воспроизведения, поэтому их следует использовать только для идемпотентных запросов (GET) и никогда для изменяющих состояние операций.
Удалённые алгоритмы и возможности
TLS 1.3 агрессивно удаляет криптографические примитивы, признанные слабыми или ненужными:
| Удалённая функция | Причина |
|---|---|
| RSA key exchange | Нет прямой секретности — компрометация ключа раскрывает весь прошлый трафик |
| Шифры CBC | Уязвимы к атакам padding oracle (POODLE, Lucky13) |
| RC4 | Известные смещения и уязвимости |
| SHA-1 для подписей | Устойчивость к коллизиям нарушена |
| Статический DH / ECDH | Нет прямой секретности |
| Пользовательские DHE-группы | Риск слабых параметров (атака Logjam) |
| Экспортные шифры | Намеренно ослабленные (атака FREAK) |
| Сжатие | Вектор атаки CRIME |
| Renegotiation | Сложность и поверхность атаки |
Поддерживаемые наборы шифров
TLS 1.3 поддерживает только пять наборов шифров, все с аутентифицированным шифрованием (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
Все наборы шифров TLS 1.3 обеспечивают прямую секретность по умолчанию. Алгоритм обмена ключами (ECDHE или DHE) согласуется отдельно от набора шифров.
Прямая секретность по умолчанию
В TLS 1.2 прямая секретность была опциональной — зависела от выбора ECDHE или DHE. Многие серверы использовали RSA, что означало: компрометация ключа сервера в будущем раскрывала весь ранее записанный трафик.
TLS 1.3 делает прямую секретность обязательной. Каждое соединение использует эфемерный обмен ключами, поэтому каждая сессия имеет уникальный ключ.
Зашифрованное рукопожатие
В TLS 1.2 сертификат сервера передаётся в открытом виде. Это позволяет пассивным наблюдателям определить, к какому сайту подключается клиент. TLS 1.3 шифрует сертификат сервера и большинство сообщений рукопожатия после ServerHello, значительно улучшая конфиденциальность.
Влияние на производительность
| Метрика | TLS 1.2 | TLS 1.3 | Улучшение |
|---|---|---|---|
| Полное рукопожатие | 2 RTT | 1 RTT | На 50% меньше круговых обходов |
| Возобновление | 1 RTT | 0 RTT | Нулевая задержка для повторных визитов |
| Накладные расходы шифрования | Переменные (CBC/GCM) | Только AEAD | Более эффективное шифрование |
| Сообщения рукопожатия | 6-8 | 2-3 | Проще, меньше пакетов |
При RTT 50 мс TLS 1.3 экономит 50 мс на каждом новом соединении и 100 мс на каждом возобновлении по сравнению с TLS 1.2.
Настройка сервера
Включение TLS 1.3 на современных веб-серверах несложно:
# Nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# Apache
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
Проверка поддержки TLS 1.3
# Тест с OpenSSL
openssl s_client -connect example.com:443 -tls1_3
# Тест с curl
curl -v --tlsv1.3 https://example.com 2>&1 | grep "SSL connection"
# Проверка поддерживаемых протоколов
nmap --script ssl-enum-ciphers -p 443 example.com
Итоги
TLS 1.3 — значительное улучшение TLS 1.2 по всем параметрам: быстрее (1-RTT рукопожатие, 0-RTT возобновление), безопаснее (обязательная прямая секретность, удалены устаревшие алгоритмы) и проще (меньше наборов шифров, зашифрованное рукопожатие). Если ваши серверы до сих пор поддерживают только TLS 1.2, обновление до TLS 1.3 — одно из самых эффективных улучшений производительности и безопасности с минимальными усилиями по настройке.
Проверьте ваш сайт прямо сейчас
Проверить →