TLS

Материал из llmdocs — справочник разработчика
TLS
Полное названиеTransport Layer Security
ПредшественникSSL (Netscape, 1995–1996)
Текущая версияTLS 1.3 (RFC 8446, август 2018)
Поддерживаемые версииTLS 1.2, TLS 1.3
Работает поверхTCP (вариант для UDP — DTLS, встроен в QUIC)
Порт HTTPS443
Стандартизация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):

  1. ClientHello — клиент отправляет поддерживаемые версии и шифронаборы, свою часть обмена ключами (key share) и расширения, в том числе имя сервера (SNI) и список прикладных протоколов (ALPN).[5][6]
  2. ServerHello — сервер выбирает параметры и отвечает своей частью обмена ключами. С этого момента обе стороны вычисляют общий секрет, и всё дальнейшее шифруется.
  3. Сервер присылает сертификат, подпись рукопожатия (CertificateVerify) и Finished.
  4. Клиент проверяет цепочку сертификатов до доверенного центра сертификации (см. Сертификат 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, включают безопасные значения по умолчанию.

См. также

Источники

  1. RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3
  2. RFC 5246 — The TLS Protocol Version 1.2
  3. RFC 8996 — Deprecating TLS 1.0 and TLS 1.1
  4. RFC 7568 — Deprecating Secure Sockets Layer Version 3.0
  5. RFC 6066 — TLS Extensions (Server Name Indication)
  6. RFC 7301 — TLS Application-Layer Protocol Negotiation Extension
  7. Mozilla — Server Side TLS recommendations