Алгоритм работы 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) для проверки целостности, и всё это шифруется с помощью симметричных алгоритмов, согласованных во время рукопожатия.
Этот элегантный процесс, невидимый для конечного пользователя, является краеугольным камнем безопасности в сети, обеспечивая конфиденциальность, целостность и аутентичность наших данных при каждом посещении защищенного сайта.