Урок по треку Сети и HTTP 7 мин

HTTPS и TLS за 7 минут

Как TLS 1.3 шифрует трафик, зачем сертификаты и цепочка доверия, HSTS.

HTTPS это обычный HTTP внутри зашифрованного TLS-канала. TLS решает три задачи:

  1. Конфиденциальность - посторонний в сети (Wi-Fi в кафе, провайдер) видит только шифрованный поток.
  2. Целостность - данные нельзя незаметно подменить по дороге.
  3. Аутентификация сервера - ты точно говоришь с bank.example, а не с тем, кто перехватил трафик.

Асимметрия и симметрия

Асимметричная криптография (пара ключей, открытый и закрытый) медленная, но позволяет договориться с незнакомцем. Симметричная (один общий ключ, AES-GCM или ChaCha20-Poly1305) быстрая. TLS использует обе: асимметрию на рукопожатии, чтобы договориться об общем секрете и проверить сервер, а потом шифрует данные симметрично.

Рукопожатие TLS 1.3

Клиент                                    Сервер
ClientHello: версии, шифры, key_share, SNI  ->
                 <-  ServerHello: key_share
                     Certificate, CertificateVerify, Finished (уже зашифрованы)
Finished, первый HTTP-запрос  ->
  • Клиент сразу шлёт свою часть обмена ключами (ECDHE). Сервер отвечает своей, и обе стороны вычисляют общий секрет. Поэтому TLS 1.3 укладывается в 1 RTT (TLS 1.2 требовал 2).
  • Сервер подписывает рукопожатие закрытым ключом сертификата (CertificateVerify): так доказывает, что владеет сертификатом.
  • Forward secrecy: ключи сессии одноразовые. Даже если закрытый ключ сервера украдут потом, записанный ранее трафик не расшифровать. В TLS 1.3 обмен ключами через RSA убрали, остался только ECDHE/DHE.
  • 0-RTT при повторном подключении: клиент шлёт данные сразу с первым пакетом. Минус: такие данные можно переотправить (replay), поэтому 0-RTT годится только для идемпотентных запросов.

SNI (имя сайта в ClientHello) по умолчанию идёт открыто, чтобы сервер выбрал нужный сертификат. Скрыть его может расширение ECH, но оно пока поддерживается не везде.

Сертификаты и цепочка доверия

Сертификат связывает домен с открытым ключом и подписан удостоверяющим центром (CA).

Корневой CA (лежит в хранилище ОС/браузера)
  └─ Промежуточный CA
       └─ Сертификат сайта (example.com)

Браузер проверяет: подписи по цепочке до доверенного корня, срок действия, совпадение домена (в том числе wildcard *.example.com, который покрывает ровно один уровень), не отозван ли. Сервер обязан отдавать промежуточные сертификаты: частая ошибка конфигурации, когда в браузере работает (он умеет докачивать), а в curl и мобильных клиентах нет.

Let's Encrypt выдаёт бесплатные сертификаты по протоколу ACME, сертификат подтверждает только владение доменом (DV).

HSTS

Пользователь набирает bank.example, браузер идёт по HTTP, и первый запрос можно перехватить (SSL stripping). Заголовок

Strict-Transport-Security: max-age=31536000; includeSubDomains

запоминает в браузере: этот домен только по HTTPS. Первый визит защищает HSTS preload list, вшитый в браузеры.

Частые ошибки

  • «HTTPS шифрует всё, даже домен». IP и SNI видны, домен через DNS тоже, если не DoH.
  • «Данные шифруются ключом из сертификата». Ключ сертификата нужен для подписи, данные шифруются сессионным ключом.
  • Не отдают промежуточный сертификат.
  • Mixed content: на HTTPS-странице ресурс по HTTP, браузер его блокирует или апгрейдит.

Что спросят на собесе

  • Как браузер понимает, что сертификат настоящий?
  • Почему TLS использует и асимметричное, и симметричное шифрование?
  • Что такое forward secrecy?
  • Чем TLS 1.3 быстрее TLS 1.2 и чем опасен 0-RTT?
  • Зачем HSTS, если есть редирект с HTTP на HTTPS?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.