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

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

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

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

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

Связанный контент


Желаете продолжить обучение?

Подпишитесь на theNET, ежемесячный обзор наиболее популярных аналитических сведений об Интернете от Cloudflare!

Посмотрите Политику конфиденциальности Cloudflare, чтобы узнать, как мы собираем и обрабатываем ваши персональные данные.

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

Что такое 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, который в настоящее время считается небезопасным, использовался в версиях TLS до версии 1.3. Это происходит примерно следующим образом:

  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. Цифровая подпись сервера: Сервер вычисляет цифровую подпись всех сообщений до этого момента.
  4. Цифровая подпись подтверждена: Клиент проверяет цифровую подпись сервера, подтверждая, что сервер является тем, за кого он себя выдает.
  5. Параметр DH клиента: Клиент отправляет серверу свой параметр DH.
  6. Клиент и сервер вычисляют premaster secret: Вместо того чтобы клиент генерировал premaster secret и отправлял его серверу, как в RSA-рукопожатии, клиент и сервер по отдельности используют параметры DH, которыми они обменялись, для вычисления подходящего premaster secret'а.
  7. Создание сеансовых ключей: Теперь клиент и сервер вычисляют сеансовые ключи из premaster secret'а, random'а клиента и random'а сервера, как и при RSA-рукопожатии.
  8. Клиент готов: То же самое, что и рукопожатие RSA.
  9. Сервер готов
  10. Безопасность симметричного шифрования достигнута

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

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

Чем отличается рукопожатие в TLS 1.3?

TLS 1.3 не поддерживает RSA, а также другие наборы шифров и параметры, которые уязвимы для атак. Также сокращает время рукопожатия TLS, делая рукопожатие TLS 1.3 более быстрым и безопасным.

Основными шагами рукопожатия TLS 1.3 являются:

  • Сообщение "hello" клиента: Клиент посылает сообщение "hello", содержащее версию протокола, random клиента и список наборов шифров. Поскольку поддержка небезопасных пакетов шифров была удалена из TLS 1.3, количество возможных пакетов шифров значительно сокращено. Клиентское приложение также включает в себя параметры, которые будут использоваться для вычисления предварительного главного секрета ("premaster secret"). По сути, клиент предполагает, что он знает предпочтительный метод обмена ключами сервера (что, вероятно, соответствует действительности благодаря упрощенному списку пакетов шифров). Это сокращает общую продолжительность рукопожатия — одно из важных различий между рукопожатиями TLS 1.3 и рукопожатиями TLS 1.0, 1.1 и 1.2.
  • Сервер генерирует главный секрет: На данный момент сервер получил клиентский пароль, а также параметры клиента и наборы шифров. У него уже есть случайное значение сервера, так как он может генерировать его самостоятельно. Таким образом, сервер может создать главный секрет.
  • Приветствие сервера и сообщение "Готово": Приветствие сервера включает сертификат сервера, цифровую подпись, пароль сервера и выбранный набор шифров. Поскольку у него уже есть главный секрет, он также отправляет сообщение "Готово".
  • Заключительные шаги и сообщение клиента "Готово": Клиент проверяет подпись и сертификат, генерирует главный секрет и отправляет сообщение "Готово".
  • Безопасность симметричного шифрования достигнута

Режим 0-RTT для возобновления сеанса

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

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

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

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