TLS
| Полное название | Transport Layer Security |
|---|---|
| Предшественник | SSL (Netscape, 1995–1996) |
| Текущая версия | TLS 1.3 (RFC 8446, август 2018) |
| Поддерживаемые версии | TLS 1.2, TLS 1.3 |
| Работает поверх | TCP (вариант для UDP — DTLS, встроен в QUIC) |
| Порт HTTPS | 443 |
| Стандартизация | IETF |
| Реализации | OpenSSL, BoringSSL, LibreSSL, GnuTLS, rustls, Go crypto/tls |
TLS (англ. Transport Layer Security — протокол защиты транспортного уровня) — криптографический протокол, который защищает передачу данных между двумя программами: шифрует трафик, проверяет его целостность и подтверждает подлинность сервера (а при необходимости и клиента) с помощью сертификатов. TLS — то, что превращает HTTP в HTTPS; он же защищает почту (SMTP, IMAP), DNS (DoT, DoH), базы данных и множество других протоколов. Часто его по старой памяти называют SSL.
История
Протокол SSL (Secure Sockets Layer) разработала компания Netscape для своего браузера: SSL 2.0 вышел в 1995 году, SSL 3.0 — в 1996-м. Затем стандарт перешёл в IETF и был переименован:
| Версия | Год | Документ | Статус |
|---|---|---|---|
| SSL 3.0 | 1996 | RFC 6101 (исторический) | запрещён с 2015 (RFC 7568)[4] |
| TLS 1.0 | 1999 | RFC 2246 | устарел, RFC 8996 (2021)[3] |
| TLS 1.1 | 2006 | RFC 4346 | устарел, RFC 8996 |
| TLS 1.2 | 2008 | RFC 5246[2] | поддерживается |
| TLS 1.3 | 2018 | RFC 8446[1] | актуальный |
Отказ от старых версий ускорили атаки на протокол и его реализации: BEAST (2011), CRIME (2012), POODLE (2014, против SSL 3.0). Широко известная уязвимость Heartbleed (2014) была ошибкой в библиотеке OpenSSL, а не в самом протоколе.
Как работает
Соединение состоит из двух фаз: рукопожатия (handshake), где стороны договариваются о параметрах и вырабатывают ключи, и передачи записей (record protocol), где данные шифруются согласованным симметричным алгоритмом.
Упрощённое рукопожатие TLS 1.3 занимает один круг «туда-обратно» (1-RTT):
- ClientHello — клиент отправляет поддерживаемые версии и шифронаборы, свою часть обмена ключами (key share) и расширения, в том числе имя сервера (SNI) и список прикладных протоколов (ALPN).[5][6]
- ServerHello — сервер выбирает параметры и отвечает своей частью обмена ключами. С этого момента обе стороны вычисляют общий секрет, и всё дальнейшее шифруется.
- Сервер присылает сертификат, подпись рукопожатия (CertificateVerify) и Finished.
- Клиент проверяет цепочку сертификатов до доверенного центра сертификации (см. Сертификат X.509 и центры сертификации), отправляет свой Finished — и начинается обмен данными.
Обмен ключами выполняется по алгоритму Диффи — Хеллмана на эллиптических кривых (ECDHE), поэтому даже кража закрытого ключа сервера в будущем не позволит расшифровать записанный ранее трафик — это свойство называется прямой секретностью (forward secrecy).
Что изменилось в TLS 1.3
- Рукопожатие сокращено до 1-RTT; при повторном подключении возможен режим 0-RTT (с оговорками о повторном воспроизведении).
- Удалены статический обмен ключами RSA, режим CBC, RC4, SHA-1, сжатие и пересогласование — источники многих атак.
- Осталось пять шифронаборов, все с аутентифицированным шифрованием (AEAD), например
TLS_AES_128_GCM_SHA256иTLS_CHACHA20_POLY1305_SHA256(см. Симметричное шифрование (AES, ChaCha20)). - Сертификат сервера передаётся уже в зашифрованном виде.
Открытым остаётся имя сервера в ClientHello; расширение Encrypted Client Hello (ECH) шифрует его с помощью ключа, опубликованного в DNS.
Браузеры и крупные сервисы внедряют гибридный постквантовый обмен ключами (X25519 в сочетании с ML-KEM), защищающий от расшифровки записанного трафика будущими квантовыми компьютерами.
Сертификаты
Подлинность сервера подтверждает сертификат X.509, подписанный центром сертификации, которому доверяет клиент. Бесплатные сертификаты с автоматическим продлением выдаёт Let's Encrypt по протоколу ACME. При взаимной аутентификации (mTLS) сертификат предъявляет и клиент — так часто защищают связь между внутренними сервисами.
Практика
# посмотреть рукопожатие и сертификат сервера
openssl s_client -connect example.com:443 -servername example.com -tls1_3 </dev/null
# дата окончания сертификата
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate
Рекомендации по настройке серверов (наборы шифров, версии) публикует, например, Mozilla в виде профилей «Modern» и «Intermediate».[7] Веб-серверы с автоматическим TLS, такие как Caddy, включают безопасные значения по умолчанию.
См. также
Источники
- RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3
- RFC 5246 — The TLS Protocol Version 1.2
- RFC 8996 — Deprecating TLS 1.0 and TLS 1.1
- RFC 7568 — Deprecating Secure Sockets Layer Version 3.0
- RFC 6066 — TLS Extensions (Server Name Indication)
- RFC 7301 — TLS Application-Layer Protocol Negotiation Extension
- Mozilla — Server Side TLS recommendations