HTTPS и TLS
Разберём почему HTTP небезопасен, как TLS решает три ключевые проблемы и как устроены сертификаты и цепочки доверия.
Зачем нужен TLS
HTTP — это чистый текст. Всё что передаётся между браузером и сервером можно перехватить и прочитать. Логин, пароль, токен, личные данные — всё в открытом виде.
Посмотри что происходит с данными в пути при HTTP и HTTPS:
TLS (Transport Layer Security) — протокол который решает три проблемы одновременно:
- Шифрование — данные зашифрованы, перехватить и прочитать нельзя
- Аутентификация — клиент уверен что говорит именно с тем сервером, а не с мошенником
- Целостность — данные не были изменены в пути
HTTPS = HTTP + TLS. Никакого нового протокола — тот же HTTP, просто завёрнутый в TLS-туннель.
Что такое сертификат
Сертификат — это цифровой документ. Когда браузер подключается к сайту, сервер отдаёт сертификат — и браузер проверяет что перед ним именно тот сервер, а не кто-то, кто прикидывается им.
Файл .crt — это часто не один сертификат
Файл сертификата нередко содержит цепочку — твой сертификат плюс Intermediate CA. Это называется bundle или fullchain. nginx должен отдавать браузеру полную цепочку — иначе браузер не сможет построить путь доверия до Root CA.
-----BEGIN CERTIFICATE----- (твой сертификат example.com) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (Intermediate CA) -----END CERTIFICATE-----
Цепочка доверия
Один сертификат сам по себе ничего не доказывает. Нужен кто-то кому доверяют все — это Root CA (корневой удостоверяющий центр).
Когда браузер получает твой сертификат — он строит цепочку и проверяет каждую подпись:
✓ Да — браузер показывает замочек
✗ Нет — «Ваше соединение не защищено»
Что такое RTT
Прежде чем разбирать handshake, нужно понять один термин — он объясняет почему TLS 1.3 быстрее TLS 1.2.
RTT (Round-Trip Time) — время за которое пакет уходит от отправителя к получателю и возвращается обратно. Буквально: отправил → дошло → вернулось. Весь этот круг — один RTT.
RTT определяется физикой сети — расстоянием и скоростью света в кабеле. Его не ускорить никакими настройками. Каждый «круговой обмен» в handshake стоит ровно столько.
ping google.com
# 64 bytes from google.com: time=12.4 ms ← это и есть RTT
Как работает TLS Handshake
Handshake — это переговоры между клиентом и сервером перед началом передачи данных. Они договариваются как будут шифровать соединение.
публ. ключ DH, SNI
сертификат, Finished
На мобильных сетях RTT легко достигает 200–300ms. Там разница между TLS 1.2 и TLS 1.3 становится очень ощутимой: 400–600ms против 200–300ms только на handshake.
SNI — как сервер выбирает нужный сертификат
SNI (Server Name Indication) — расширение ClientHello. Клиент сразу в первом сообщении указывает к какому домену обращается. Сервер смотрит на SNI и выбирает нужный сертификат ещё до того как отправит ServerHello.
Без SNI на одном IP можно держать только один сертификат. С SNI — сколько угодно доменов на одном IP, каждый со своим сертификатом. Именно поэтому хостинг-провайдеры могут держать тысячи сайтов с HTTPS на одном сервере.
server {} с директивой ssl_certificate
автоматически использует SNI — nginx сам выбирает нужный сертификат по server_name.
Асимметричное и симметричное шифрование
В TLS используются оба типа — каждый для своей задачи.
🔓 публичным → расшифровывает приватный (шифрование данных)
🔒 приватным → расшифровывает публичный (цифровая подпись)
В TLS используется второй вариант — CA подписывает сертификат приватным ключом, браузер проверяет подпись публичным ключом CA. Медленное — только handshake
Схема совместной работы:
Клиент и сервер обмениваются публичными параметрами и независимо вычисляют общий сессионный ключ. Сам ключ по сети не передаётся.
Все данные шифруются быстрым AES с общим сессионным ключом. Ключ уникален для каждого соединения.
Forward Secrecy — совершенная прямая секретность
Современный TLS использует Diffie-Hellman обмен (ECDHE): обе стороны обмениваются публичными параметрами и независимо вычисляют общий сессионный ключ — он никогда не передаётся по сети.
Это называется Forward Secrecy: даже если приватный ключ утечёт, расшифровать записанный ранее трафик невозможно — сессионные ключи нигде не хранятся и заново не вычисляются.