Что происходит при TLS-рукопожатии? | SSL-рукопожатие

В ходе TLS/SSL-рукопожатия клиенты и серверы обмениваются SSL-сертификатами, требованиями к набору шифров и случайно сгенерированными данными для создания сеансовых ключей.

Цели обучения

После прочтения этой статьи вы сможете:

  • Узнать, что такое TLS-рукопожатие
  • Разобраться, что дает TLS-рукопожатие
  • Выяснить этапы TLS-рукопожатия
  • Изучить различные типы TLS-рукопожатий

Копировать ссылку статьи

Что такое TLS-рукопожатие?

TLS-рукопожатие

TLS – это протокол шифрования, разработанный для защиты интернет-коммуникаций. TLS-рукопожатие – это процесс, который запускает сеанс связи, использующий TLS-шифрование. Во время TLS-рукопожатия две взаимодействующие стороны обмениваются сообщениями, чтобы подтвердить друг друга, проверить друг друга, установить алгоритмы шифрования, которые они будут использовать, и согласовать ключи сеанса. TLS-рукопожатия являются важной составляющей процесса работы HTTPS.

TLS- или SSL-рукопожатие

SSL, или Secure Sockets Layer, был оригинальным протоколом шифрования, разработанным для HTTP. Некоторое время назад SSL был заменен на TLS, или Transport Layer Security. SSL-рукопожатия теперь называются TLS-рукопожатиями, хотя название "SSL" по-прежнему широко используется.

Когда происходит TLS-рукопожатие?

TLS-рукопожатие происходит всякий раз, когда пользователь переходит на веб-сайт по протоколу HTTPS, и браузер сначала начинает запрашивать сервер-источник сайта. TLS-рукопожатие также происходит всякий раз, когда любые другие коммуникации используют HTTPS, включая вызовы API и запросы DNS-over-HTTPS.

TLS-рукопожатие происходит после того, как с помощью TCP-рукопожатия было установлено TCP-соединение.

Что происходит при TLS-рукопожатии?

В ходе TLS-рукопожатия клиент и сервер вместе выполняют следующие действия:

  • Указывают, какую версию TLS (TLS 1.0, 1.2, 1.3 и т. д.) они будут использовать
  • Решают, какие наборы шифров (см. ниже) они будут использовать
  • Проверяют подлинность сервера с помощью открытого ключа сервера и цифровой подписи центра сертификации SSL.
  • Генерируют сеансовые ключи, чтобы использовать симметричное шифрование после завершения рукопожатия

Каковы этапы TLS-рукопожатия?

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

Точные шаги в рамках TLS-рукопожатия зависят от используемого алгоритма обмена ключами и наборов шифров, поддерживаемых обеими сторонами. Чаще всего используется алгоритм обмена ключами RSA. Происходит следующая процедура:

  1. Сообщение "hello" клиента: Клиент инициирует рукопожатие, посылая серверу сообщение "hello". В сообщении будет указано, какую версию TLS поддерживает клиент, поддерживаемые наборы шифров и строка случайных байтов, известная как "random клиента".
  2. Сообщение "hello" сервера: В ответ на сообщение "hello" клиента сервер отправляет сообщение, содержащее SSL-сертификат сервера, выбранный сервером набор шифров и "random сервера" – еще одну строку случайных байтов, генерируемую сервером.
  3. Аутентификация: Клиент проверяет SSL-сертификат сервера в центре сертификации, который его выдал. Он подтверждает, что сервер является тем, за кого себя выдает, и что клиент взаимодействует с реальным владельцем домена.
  4. Premaster secret: Клиент посылает еще одну строку случайных байтов, которая называется "premaster secret". Premaster secret шифруется открытым ключом и может быть расшифрован сервером только с помощью закрытого ключа. (Клиент берет открытый ключ из SSL-сертификата сервера).
  5. Используемый закрытый ключ: Сервер расшифровывает "premaster secret".
  6. Создание сеансовых ключей: Клиент и сервер генерируют сеансовые ключи из random'а клиента, random'а сервера и premaster secret. Они должны прийти к одинаковым результатам.
  7. Клиент готов: Клиент отправляет сообщение "готово", зашифрованное сеансовым ключом.
  8. Сервер готов: Сервер отправляет сообщение "готово", зашифрованное сеансовым ключом.
  9. Безопасность симметричного шифрования достигнута: Рукопожатие завершено, и связь продолжается с использованием сеансовых ключей.

Все TLS-рукопожатия используют асимметричное шифрование (открытый и закрытый ключ), но не все будут использовать закрытый ключ в процессе генерации сеансовых ключей. Например, кратковременное рукопожатие Диффи-Хеллмана происходит следующим образом:

  1. Сообщение "hello" клиента: Клиент посылает сообщение "hello", содержащее версию протокола, random клиента и список наборов шифров.
  2. Сообщение "hello" сервера: Сервер отвечает своим SSL-сертификатом, выбранным набором шифров и random'ом сервера. В отличие от описанного выше RSA-рукопожатия, в это сообщение сервер также включает следующее (шаг 3):
  3. Цифровая подпись сервера: Сервер использует свой закрытый ключ для шифрования random'а клиента, random'а сервера и своего параметра DH*. Эти зашифрованные данные выполняют функцию цифровой подписи сервера, устанавливая, что сервер имеет закрытый ключ, совпадающий с открытым ключом из SSL-сертификата.
  4. Подтверждение цифровой подписи: Клиент расшифровывает цифровую подпись сервера с помощью открытого ключа, проверяя, что сервер владеет закрытым ключом и является тем, за кого себя выдает. Параметр DH клиента: Клиент отправляет серверу свой параметр DH.
  5. Клиент и сервер вычисляют premaster secret: Вместо того чтобы клиент генерировал premaster secret и отправлял его серверу, как в RSA-рукопожатии, клиент и сервер по отдельности используют параметры DH, которыми они обменялись, для вычисления подходящего premaster secret'а.
  6. Создание сеансовых ключей: Теперь клиент и сервер вычисляют сеансовые ключи из premaster secret'а, random'а клиента и random'а сервера, как и при RSA-рукопожатии.
  7. Клиент готов:
  8. Как и при RSA-рукопожатии.
  9. Сервер готов
  10. Безопасность симметричного шифрования достигнута

*Параметр DH: DH – это аббревиатура от Diffie-Hellman (Диффи-Хеллман). Алгоритм Диффи-Хеллмана использует экспоненциальные вычисления для получения одного и того же premaster secret'а. Сервер и клиент предоставляют свои параметры для вычисления, они проводят различные вычисления с каждой стороны, но получают одинаковый результат.

Более подробно о различиях между эфемерными рукопожатиями Диффи-Хеллмана и другими видами рукопожатий, а также о том, как с их помощью достигается прямая секретность, читайте в статье Что такое Keyless SSL?.

Что такое набор шифров?

Набор шифров – это ряд алгоритмов шифрования, используемый при установлении защищенного соединения. (Алгоритм шифрования – это ряд математических операций, выполняемых над данными для придания им случайного вида). Существует несколько широко используемых наборов шифров, и важной частью TLS-рукопожатия является согласование того, какой набор шифров будет использоваться для такого рукопожатия.

Чтобы узнать больше о TLS/SSL, см. раздел Как работает SSL? Чтобы проверить, правильно ли сайт использует TLS, посетите Диагностический центр Cloudflare.

Продажи