Открыть сервис

Рукопожатие TLS

Рукопожатие TLS — это криптографический протокол, устанавливающий защищённое соединение между двумя сторонами (клиентом и сервером) в рамках протокола Transport Layer Security (TLS). Основная цель рукопожатия — аутентификация сторон (обычно сервера, а иногда и клиента), согласование параметров шифрования (версии протокола, набора шифров) и генерация сеансовых ключей для последующего симметричного шифрования данных. Рукопожатие TLS является фундаментальным механизмом обеспечения безопасности в Интернете, лежащим в основе HTTPS, защищённой электронной почты, VPN и многих других сетевых протоколов.

История

Протокол TLS является преемником протокола Secure Sockets Layer (SSL), разработанного компанией Netscape Communications в середине 1990-х годов. Первая версия SSL (SSL 1.0) никогда не публиковалась из-за серьёзных уязвимостей. SSL 2.0 был выпущен в 1995 году, но также содержал критические недостатки, что привело к разработке SSL 3.0 в 1996 году. В 1999 году IETF (Internet Engineering Task Force) опубликовала RFC 2246, стандартизировав протокол TLS 1.0, который был основан на SSL 3.0, но с рядом улучшений и переименованием, чтобы избежать юридических ограничений, связанных с торговой маркой SSL.

Последующие версии TLS последовательно устраняли уязвимости и вводили новые криптографические алгоритмы:

  • TLS 1.1 (RFC 4346, 2006): добавлена защита от атак на вектор инициализации (IV) для CBC-режимов шифрования.
  • TLS 1.2 (RFC 5246, 2008): введена поддержка аутентифицированного шифрования (AEAD) с помощью GCM и CCM, а также возможность использования гибких алгоритмов хэширования (SHA-256, SHA-384).
  • TLS 1.3 (RFC 8446, 2018): коренная переработка протокола. Упрощено рукопожатие (сокращено с двух до одного раунда в большинстве случаев), удалены устаревшие и небезопасные алгоритмы (RSA для обмена ключами, CBC-режимы, статические ключи Диффи-Хеллмана), обязательным стало использование Perfect Forward Secrecy (PFS).

На момент 2024 года TLS 1.3 является рекомендованной версией, а TLS 1.0 и TLS 1.1 официально признаны устаревшими и отключены в большинстве современных браузеров и серверов. SSL 2.0 и SSL 3.0 запрещены к использованию из-за фатальных уязвимостей (например, POODLE).

Принцип работы

Рукопожатие TLS можно разделить на несколько логических фаз. В зависимости от версии протокола и используемых криптографических алгоритмов, количество сообщений и их содержание различаются. Ниже описан упрощённый сценарий для TLS 1.2, как наиболее распространённой версии на протяжении 2010-х годов, и для TLS 1.3.

Рукопожатие в TLS 1.2 (полный обмен)

  1. ClientHello: Клиент отправляет серверу сообщение, содержащее:
  • Версию протокола TLS, которую он поддерживает (например, TLS 1.2).
  • Список поддерживаемых наборов шифров (Cipher Suites) — комбинаций алгоритмов аутентификации, обмена ключами, шифрования и хэширования.
  • Список поддерживаемых методов сжатия (обычно «null»).
  • Случайное число (Client Random), используемое для генерации ключей.
  • Опционально: расширения (SNI, ALPN, поддерживаемые группы для ECDHE и т.д.).
  1. ServerHello: Сервер отвечает, выбирая из предложенных клиентом параметров:
  • Версию протокола (обычно самую высокую из общих).
  • Один набор шифров.
  • Один метод сжатия.
  • Своё случайное число (Server Random).
  • Опционально: расширения.
  1. Server Certificate: Сервер отправляет свой цифровой сертификат (X.509), который содержит открытый ключ сервера и информацию о его владельце, подписанный удостоверяющим центром (CA). Клиент проверяет сертификат: срок действия, цепочку доверия до корневого CA, соответствие доменному имени.
  1. Server Key Exchange (опционально): Отправляется, если выбранный набор шифров не позволяет получить ключи из сертификата (например, при использовании протокола Диффи-Хеллмана на эллиптических кривых — ECDHE). Содержит параметры для обмена ключами (например, открытый ключ ECDHE сервера), подписанные закрытым ключом сервера.
  1. ServerHelloDone: Сервер сообщает, что закончил отправку приветственных сообщений.
  1. Client Key Exchange: Клиент генерирует свой вклад в обмен ключами. В случае ECDHE — это открытый ключ ECDHE клиента. В случае RSA (устаревший) — это предварительный секрет (Pre-Master Secret), зашифрованный открытым ключом сервера из сертификата.
  1. Change Cipher Spec: Клиент сообщает, что с этого момента будет использовать согласованные параметры шифрования для отправки данных.
  1. Finished: Клиент отправляет зашифрованное сообщение, содержащее хэш всех предыдущих сообщений рукопожатия (для проверки целостности и отсутствия подмены). Сервер расшифровывает и проверяет его.
  1. Change Cipher Spec: Сервер подтверждает переход на шифрование.
  1. Finished: Сервер отправляет своё зашифрованное сообщение Finished. Клиент проверяет его.

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

Рукопожатие в TLS 1.3

TLS 1.3 значительно упростил процесс, сократив количество сообщений и обязательных раундов.

  1. ClientHello: Клиент отправляет не только поддерживаемые версии и наборы шифров, но и свои открытые ключи для обмена ключами (например, для ECDHE) в расширении key_share. Также он может отправить информацию о ранее установленных сессиях (PSK).
  1. ServerHello: Сервер выбирает параметры и отправляет свой открытый ключ в key_share. На основе ключей обеих сторон немедленно вычисляется общий секрет.
  1. Server Certificate: Сервер отправляет сертификат и своё сообщение Finished, уже зашифрованные полученным ключом.
  1. Client Finished: Клиент отправляет своё Finished.

Таким образом, TLS 1.3 завершает рукопожатие за один круговой обмен (1-RTT) в новом соединении, а при возобновлении сессии (0-RTT) клиент может начать отправлять данные сразу после ClientHello, без ожидания ответа сервера.

Классификация и виды рукопожатий

Рукопожатия TLS можно классифицировать по нескольким критериям.

По версии протокола

  • SSL 2.0/3.0: устаревшие, небезопасные.
  • TLS 1.0/1.1: устаревшие, не рекомендуются к использованию.
  • TLS 1.2: широко распространён, но постепенно вытесняется.
  • TLS 1.3: современный стандарт, обеспечивающий наилучшую производительность и безопасность.

По аутентификации

  • Односторонняя аутентификация: аутентифицируется только сервер (наиболее распространённый случай в вебе).
  • Взаимная аутентификация (mTLS): аутентифицируются и сервер, и клиент. Клиент также отправляет свой сертификат, который проверяется сервером. Используется в корпоративных сетях, API, системах управления доступом.

По механизму обмена ключами

  • Статический обмен (RSA): клиент шифрует предварительный секрет открытым ключом сервера. Не обеспечивает Perfect Forward Secrecy (PFS) — если закрытый ключ сервера будет скомпрометирован, все прошлые сеансы могут быть расшифрованы. Устарел.
  • Эфемерный обмен (DHE, ECDHE): используется протокол Диффи-Хеллмана с эфемерными (временными) ключами. Обеспечивает PFS. Является обязательным в TLS 1.3.
  • Pre-Shared Key (PSK): используется общий секрет, полученный из предыдущего сеанса (возобновление сессии) или установленный внешним способом. Позволяет сократить рукопожатие.

По режиму возобновления сессии

  • Полное рукопожатие: полный обмен сообщениями, как описано выше.
  • Сокращённое рукопожатие (Session Resumption): клиент и сервер используют ранее установленный идентификатор сессии (Session ID) или билет сессии (Session Ticket), чтобы восстановить защищённое соединение без повторной аутентификации и полного обмена ключами. В TLS 1.3 это реализовано через PSK.

Устройство и характеристики

Ключевыми компонентами рукопожатия TLS являются:

  • Набор шифров (Cipher Suite): строка, определяющая четыре алгоритма: аутентификация (например, RSA, ECDSA), обмен ключами (например, ECDHE), симметричное шифрование (например, AES-256-GCM) и хэш-функция для HMAC (например, SHA-384). Пример: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384.
  • Сертификаты (X.509): цифровые документы, связывающие открытый ключ с субъектом (доменом, организацией). Сертификаты выпускаются удостоверяющими центрами (CA). Проверка сертификата включает построение цепочки доверия до корневого CA, проверку срока действия, отзыва (через CRL или OCSP) и соответствия доменному имени.
  • Мастер-секрет (Master Secret): секретное значение, вычисляемое на основе случайных чисел клиента и сервера и предварительного секрета (или общего секрета ECDHE). Из мастер-секрета с помощью псевдослучайной функции (PRF) выводятся сеансовые ключи для шифрования, аутентификации и векторов инициализации.
  • Perfect Forward Secrecy (PFS): свойство протокола, при котором компрометация долговременного закрытого ключа сервера не позволяет расшифровать прошлые сеансы связи. Обеспечивается использованием эфемерных ключей Диффи-Хеллмана.
  • Расширения (Extensions): механизм, позволяющий добавлять новые возможности в протокол без изменения его базовой структуры. Примеры: Server Name Indication (SNI) — позволяет серверу выбрать правильный сертификат для множества сайтов на одном IP; Application-Layer Protocol Negotiation (ALPN) — согласование протокола прикладного уровня (HTTP/2, HTTP/3).

Применение

Рукопожатие TLS является неотъемлемой частью практически любой защищённой сетевой коммуникации:

  • HTTPS: защита веб-трафика. Каждый раз, когда пользователь заходит на сайт с префиксом https://`, его браузер и сервер выполняют рукопожатие TLS.
  • Электронная почта: протоколы SMTP, IMAP, POP3 могут использовать STARTTLS или TLS для шифрования соединений между почтовыми клиентами и серверами.
  • VPN: многие VPN-протоколы (например, OpenVPN, IKEv2/IPsec) используют TLS для аутентификации и обмена ключами.
  • Удалённый доступ: протокол SSH (Secure Shell) использует собственную реализацию рукопожатия, похожую на TLS, но не идентичную.
  • API и микросервисы: взаимная аутентификация TLS (mTLS) широко применяется для обеспечения безопасности межсервисного взаимодействия в распределённых системах.
  • Мессенджеры: многие современные мессенджеры (Signal, WhatsApp) используют протоколы, основанные на TLS или его модификациях, для шифрования трафика.

Критика и уязвимости

Несмотря на высокую степень защищённости, рукопожатие TLS подвергалось и продолжает подвергаться критике и атакам.

  • Сложность и уязвимости реализации: протокол сложен, и ошибки в его реализации (например, в библиотеках OpenSSL, GnuTLS) приводили к серьёзным уязвимостям, таким как Heartbleed (2014), POODLE (2014), DROWN (2016), ROBOT (2017).
  • Атаки на понижение версии (Downgrade Attacks): злоумышленник может попытаться заставить клиент и сервер использовать более старую, уязвимую версию протокола. TLS 1.3 содержит механизмы защиты от таких атак (подписанные сообщения Finished с указанием версии).
  • Атаки на PKI (Public Key Infrastructure): инфраструктура открытых ключей, на которой основана аутентификация, уязвима для компрометации удостоверяющих центров, выпуска фальшивых сертификатов и атак типа «человек посередине» (MITM) с использованием подставных CA.
  • Проблемы с отзывом сертификатов: механизмы проверки отзыва сертификатов (CRL, OCSP) не всегда работают эффективно, что позволяет использовать скомпрометированные сертификаты.
  • Задержки: полное рукопожатие TLS 1.2 требует двух круговых обменов (2-RTT), что добавляет задержку к началу передачи данных. TLS 1.3 сократил её до 1-RTT, а 0-RTT имеет свои риски (атаки повторного воспроизведения).

Интересные факты

  • Название «рукопожатие» (handshake) происходит от аналогичного процесса в человеческом общении, символизирующего приветствие и установление доверия.
  • Первое в истории рукопожатие TLS (тогда SSL) было выполнено в 1994 году между браузером Netscape Navigator 1.0 и сервером Netscape Commerce Server.
  • Размер сообщения ClientHello в TLS 1.3 может достигать нескольких килобайт из-за включения открытых ключей в расширение key_share, что может быть проблемой для некоторых сетей с ограничением размера пакетов.
  • Существует протокол DTLS (Datagram Transport Layer Security), адаптация TLS для работы поверх ненадёжных протоколов, таких как UDP, используемый в VoIP и потоковом видео.

Источники

  • RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2
  • RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
  • RFC 4346: The Transport Layer Security (TLS) Protocol Version 1.1
  • RFC 2246: The TLS Protocol Version 1.0
  • Спецификация SSL 3.0 (Netscape Communications, 1996)
  • Документация OpenSSL, GnuTLS
  • Стандарты X.509 (ITU-T)
  • Материалы IETF TLS Working Group

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →