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