Алгоритм работы https handshake

Автор: S0ER

В статье разберем установление соединения по протоколу HTTPS. Этот процесс, часто называемый «рукопожатием», представляет собой сложный, но отлаженный обмен сообщениями между клиентом (вашим браузером) и сервером, целью которого является создание зашифрованного канала для обмена данными.

Основная задача этого взаимодействия — решить две ключевые проблемы: безопасно сгенерировать общий секретный ключ для симметричного шифрования и удостовериться в подлинности сервера, к которому происходит подключение.

Фаза 1: Приветствие и список возможностей (Client Hello)

Всё начинается с того, что клиент инициирует соединение с сервером, отправляя пакет Client Hello. Этот пакет содержит важную информацию:

  • Случайное число (Client Random): Сгенерированная клиентом последовательность байт, которая будет использоваться на последующих этапах.
  • Поддерживаемые наборы шифров (Cipher Suites): Список криптографических алгоритмов, которые клиент понимает и готов использовать. Эти наборы включают алгоритмы для обмена ключами, аутентификации, симметричного шифрования и вычисления кода целостности сообщения.
  • Поддерживаемые версии протокола TLS.
  • Имя сервера (Server Name Indication, SNI): Важный параметр, который указывает, к какому именно домену клиент хочет подключиться. Это необходимо, когда на одном IP-адресе размещено несколько сайтов.

Фаза 2: Ответ сервера и сертификат (Server Hello)

Сервер, получив приветствие, отвечает своим пакетом Server Hello. В этом ответе он делает выбор:

  • Выбор алгоритмов: Сервер выбирает самый стойкий и современный набор шифров из предложенного клиентом списка и сообщает о своем выборе.
  • Свое случайное число (Server Random): Сервер также генерирует свою собственную последовательность байт для использования в дальнейшем.
  • Свой цифровой сертификат: Далее сервер отправляет клиенту свой цифровой сертификат. Этот документ содержит открытый ключ сервера и информацию о его владельце, подписанную цифровой подписью доверенного центра сертификации (удостоверяющего центра). Именно этот сертификат является основой для аутентификации сервера.

Визуализация процесса обмена ключевой информацией:

        sequenceDiagram
    participant Клиент
    participant Сервер

    Note over Клиент: Генерирует Client Random
    Клиент->>Сервер: Client Hello
(Поддерживаемые шифры,
Client Random, версия TLS, SNI) Note over Сервер: Выбирает набор шифров
Генерирует Server Random Сервер->>Клиент: Server Hello
(Выбранный набор шифров,
Server Random) Сервер->>Клиент: Цифровой сертификат

Фаза 3: Аутентификация сервера и генерация главного секрета

Клиент получает сертификат сервера и проводит его проверку. Он проверяет цифровую подпись центра сертификации, используя заранее предустановленные в его операционной системе или браузере корневые сертификаты доверенных центров. Также проверяется срок действия сертификата и его соответствие запрошенному доменному имени.

Убедившись в подлинности сервера, клиент приступает к генерации Pre-Master Secret. Это еще одно случайное число, которое будет использовано для создания общего главного ключа. Важно то, что клиент шифрует это число с помощью открытого ключа сервера, полученного из сертификата. Таким образом, расшифровать это сообщение может только обладатель соответствующего закрытого ключа — то есть законный сервер.

Затем клиент, сервер и оба случайных числа (Client Random и Server Random) используются для вычисления общего Master Secret (главного секрета). Ключевой момент: сам Pre-Master Secret по сети никогда не передается в открытом виде, а его шифрование открытым ключом сервера гарантирует конфиденциальность.

Фаза 4: Завершение рукопожатия

Теперь у обеих сторон есть общий Master Secret. На его основе они независимо друг от друга генерируют идентичные наборы ключей для симметричного шифрования и для проверки целостности данных.

Чтобы подтвердить, что весь процесс прошел успешно и ключи сгенерированы верно, клиент и сервер обмениваются финальными сообщениями Finished. Эти сообщения содержат специальный код аутентификации всех предыдущих сообщений рукопожатия, зашифрованный уже новыми, только что созданными ключами. Если обе стороны могут корректно прочитать и проверить эти сообщения, это означает, что рукопожатие прошло успешно и защищенный канал установлен.

        sequenceDiagram
    participant Клиент
    participant Сервер

    Note over Клиент: Проверяет сертификат,
генерирует Pre-Master Secret Клиент->>Сервер: Зашифрованный Pre-Master Secret
(открытым ключом сервера) Note over Клиент, Сервер: На основе Client Random,
Server Random и Pre-Master Secret
каждая сторона вычисляет
Master Secret и ключи сессии Клиент->>Сервер: Change Cipher Spec Клиент->>Сервер: Finished (зашифровано) Сервер->>Клиент: Change Cipher Spec Сервер->>Клиент: Finished (зашифровано) Note over Клиент, Сервер: Рукопожатие завершено.
Защищенный канал установлен.

Фаза 5: Защищенный обмен данными

После успешного завершения рукопожатия начинается основная сессия связи. Все передаваемые данные приложения (HTTP-запросы, ответы, любая информация) фрагментируются, при необходимости сжимаются, затем к ним добавляется код аутентификации сообщения (MAC) для проверки целостности, и всё это шифруется с помощью симметричных алгоритмов, согласованных во время рукопожатия.

Этот элегантный процесс, невидимый для конечного пользователя, является краеугольным камнем безопасности в сети, обеспечивая конфиденциальность, целостность и аутентичность наших данных при каждом посещении защищенного сайта.