HTTPS это обычный HTTP внутри зашифрованного TLS-канала. TLS решает три задачи:
- Конфиденциальность - посторонний в сети (Wi-Fi в кафе, провайдер) видит только шифрованный поток.
- Целостность - данные нельзя незаметно подменить по дороге.
- Аутентификация сервера - ты точно говоришь с
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?