linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
home/linux/how/tls-handshake

how/network

TLS handshake - как браузер договаривается с сервером

Зелёный замочек в браузере появляется не сразу. До него - несколько пакетов где стороны выбирают шифр, проверяют сертификат и вычисляют общий ключ.

Когда ты открываешь https://example.com, до того как в браузере появится содержимое страницы - клиент и сервер должны договориться о зашифрованном канале. Это и есть TLS handshake.

В нём решается несколько задач сразу:

  • какой cipher suite использовать (какие алгоритмы шифрования)
  • сервер аутентифицируется через сертификат (доказывает «я и правда example.com»)
  • стороны вычисляют общий session key для симметричного шифрования (без передачи самого ключа по сети)

Нажми ▶ - посмотрим как это всё происходит за 3 пакета (TLS 1.2 - у 1.3 хитрее, всё в 1 round-trip, но идея та же).

step 1/7·00 · TCP уже установлен, начинаем TLS
clientTLS handshake…servernginx :443helloLISTENtcp-соединение уже установлено. поверх него начинается tls-handshakerfc 5246 (tls 1.2) · современный tls 1.3 умещает то же в 1 round-trip

§ шаги

  1. Перед TLS должен быть готов транспортный канал - TCP-соединение в ESTABLISHED (см. tcp-handshake).

    Поверх этого канала начинается отдельный handshake - теперь договариваемся о шифровании. До его завершения никаких HTTP-данных не передаётся - только служебные TLS-сообщения.

итого

Что важно запомнить:

  • TLS работает поверх TCP (см. tcp-handshake). Сначала устанавливается TCP, потом - TLS поверх него. Первое HTTP-сообщение отправляется только после TLS handshake'а
  • В ClientHello клиент шлёт SNI (Server Name Indication) - имя домена. Это нужно потому что один IP может хостить много HTTPS-сайтов, и сервер должен знать какой сертификат отдать
  • Сертификат - это публичный ключ + подпись CA. Сервер владеет приватным ключом к этому сертификату - это и доказывает что он «настоящий» (только владелец приватного ключа может расшифровать то что зашифровано публичным)
  • Session key не передаётся по сети - он вычисляется обеими сторонами из обмена. В современных шифрах используется ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) - даже если кто-то записал весь handshake, он не сможет расшифровать данные потом. Это называется forward secrecy
  • TLS 1.3 упростил handshake до 1-RTT (один round-trip): ClientHello уже содержит ключевой материал, сервер сразу отвечает своим ChangeCipherSpec + Finished, дальше - данные. Гораздо быстрее
  • Если хочешь покопаться руками - есть урок intermediate-09-tls- handshake где разбирается реальный pcap с tcpdump'а

Связано с [[tls-handshake|расширенной статьей в KB]] и со следующим explainer'ом про HTTPS cert chain validation - что происходит когда браузер проверяет сертификат.

§ копнуть в базу знаний

  • tls-handshakeTLS handshake - расширенная статья
  • tcp-handshakeTCP handshake - что предшествует TLS
  • portport - почему HTTPS на 443

§ попробовать руками

  • ›intermediate-09-tls-handshake- TLS handshake - посмотреть pcap
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки