Протокол рукопожатия TLS
Протокол рукопожатия TLS (TLS Handshake Protocol) — это криптографический протокол, являющийся частью семейства протоколов Transport Layer Security (TLS), который обеспечивает установление защищённого соединения между клиентом и сервером. Его основная функция — аутентификация сторон (обычно сервера, а опционально и клиента), согласование параметров шифрования (криптографических алгоритмов, ключей сессии) и генерация общего секретного ключа для последующего симметричного шифрования данных. Протокол рукопожатия предшествует передаче данных по защищённому каналу и является критически важным для обеспечения конфиденциальности, целостности и аутентичности соединения.
История развития
Протокол рукопожатия TLS прошёл несколько этапов эволюции, каждый из которых был связан с устранением уязвимостей и повышением производительности.
SSL (Secure Sockets Layer)
Предшественником TLS был протокол SSL, разработанный компанией Netscape Communications в середине 1990-х годов. Версия SSL 1.0 никогда не публиковалась из-за серьёзных недостатков. SSL 2.0 (1995) содержал множество уязвимостей, включая отсутствие аутентификации клиента и слабые алгоритмы шифрования. SSL 3.0 (1996) стал значительным улучшением, но впоследствии также был признан устаревшим и небезопасным.
TLS 1.0 и 1.1
В 1999 году IETF (Internet Engineering Task Force) опубликовала спецификацию TLS 1.0 (RFC 2246), которая фактически являлась незначительной модификацией SSL 3.0. TLS 1.1 (RFC 4346, 2006) внёс улучшения, включая защиту от атак с использованием векторов инициализации (IV) в режиме CBC. Обе версии со временем были признаны устаревшими из-за уязвимостей, таких как атаки POODLE и BEAST.
TLS 1.2
Опубликованный в 2008 году (RFC 5246), TLS 1.2 стал широко используемой версией. Он значительно расширил набор поддерживаемых криптографических алгоритмов, ввёл поддержку аутентифицированного шифрования (AEAD, например, AES-GCM) и отказался от устаревших алгоритмов, таких как SHA-1 для подписей. TLS 1.2 остаётся актуальным, но постепенно вытесняется более современной версией.
TLS 1.3
В 2018 году был утверждён TLS 1.3 (RFC 8446). Эта версия представляет собой кардинальное упрощение и ускорение протокола рукопожатия. Ключевые изменения включают:
- Сокращение числа раундов: рукопожатие TLS 1.3 обычно выполняется за один круговой обмен (1-RTT), а при возобновлении сессии — за 0-RTT.
- Удаление устаревших алгоритмов: полностью исключены небезопасные алгоритмы (например, RSA для обмена ключами, CBC-режимы, SHA-1).
- Обязательное использование Perfect Forward Secrecy (PFS): обмен ключами осуществляется только через протокол Диффи-Хеллмана (DH) или эллиптическую кривую (ECDH).
- Шифрование рукопожатия: большая часть сообщений рукопожатия шифруется сразу после установления общего секрета, что защищает метаданные соединения.
Процесс рукопожатия в TLS 1.2
Протокол рукопожатия TLS 1.2 является более сложным и многоэтапным, чем в TLS 1.3. Типичное полное рукопожатие включает следующие шаги:
- ClientHello: Клиент отправляет серверу сообщение, содержащее поддерживаемые версии TLS, список криптографических алгоритмов (Cipher Suites), случайное число (Client Random) и, опционально, расширения (например, SNI — Server Name Indication).
- ServerHello: Сервер выбирает версию TLS и один набор шифров (Cipher Suite) из списка клиента, отправляет своё случайное число (Server Random) и свой идентификатор сессии (Session ID).
- ServerCertificate: Сервер отправляет свой цифровой сертификат (обычно X.509), который содержит его открытый ключ и подпись удостоверяющего центра (CA). Этот сертификат используется для аутентификации сервера.
- ServerKeyExchange (опционально): Если выбранный набор шифров использует протокол Диффи-Хеллмана (DHE или ECDHE) для обмена ключами, сервер отправляет свои параметры DH (открытое значение, используемая группа). Для RSA-обмена ключами этот шаг не требуется.
- ServerHelloDone: Сервер сигнализирует, что завершил отправку своих сообщений.
- ClientKeyExchange: Клиент генерирует свой вклад в общий секрет. В случае RSA — это предварительный главный секрет (Pre-Master Secret), зашифрованный открытым ключом сервера. В случае DH — это открытое значение DH клиента.
- ChangeCipherSpec: Клиент отправляет сообщение, уведомляющее о том, что все последующие сообщения будут зашифрованы с использованием согласованных параметров.
- Finished: Клиент отправляет зашифрованное сообщение, содержащее хеш всего предыдущего рукопожатия (для проверки целостности и отсутствия атак типа man-in-the-middle).
- ChangeCipherSpec: Сервер также отправляет это сообщение.
- Finished: Сервер отправляет своё зашифрованное сообщение, подтверждающее успешное завершение рукопожатия.
После этого этапа начинается защищённая передача данных.
Процесс рукопожатия в TLS 1.3
Рукопожатие TLS 1.3 значительно упрощено и ускорено. Основные шаги:
- ClientHello: Клиент отправляет серверу не только список поддерживаемых версий и шифров, но и свою часть ключа для обмена по протоколу Диффи-Хеллмана (например, открытое значение ECDHE). Это позволяет серверу сразу вычислить общий секрет.
- ServerHello: Сервер выбирает параметры, отправляет свою часть ключа DH и свой сертификат, а также подпись (Signature) для аутентификации. Все эти данные могут быть отправлены в одном сообщении.
- ServerFinished: Сервер отправляет зашифрованное подтверждение.
- ClientFinished: Клиент отправляет зашифрованное подтверждение.
Таким образом, рукопожатие TLS 1.3 занимает всего один круговой обмен (1-RTT) вместо двух (2-RTT) в TLS 1.2. Для возобновления сессии используется механизм 0-RTT, когда клиент может начать отправлять данные сразу после первого сообщения, используя ранее сохранённый ключ.
Криптографические алгоритмы
Протокол рукопожатия использует три основных типа криптографических алгоритмов:
- Аутентификация: Используется для проверки подлинности сервера (и, опционально, клиента). Обычно это цифровые подписи на основе RSA, ECDSA (Elliptic Curve Digital Signature Algorithm) или EdDSA (Edwards-curve Digital Signature Algorithm).
- Обмен ключами: Используется для безопасного согласования общего секретного ключа между клиентом и сервером. В современных версиях TLS (1.3 и 1.2 с DHE/ECDHE) используется протокол Диффи-Хеллмана на эллиптических кривых (ECDHE), обеспечивающий Perfect Forward Secrecy (PFS). PFS гарантирует, что компрометация долговременного ключа сервера не позволит расшифровать ранее записанные сессии.
- Симметричное шифрование: После рукопожатия данные шифруются с использованием согласованного симметричного алгоритма, такого как AES (в режимах GCM, CCM, ChaCha20-Poly1305). Эти алгоритмы обеспечивают как конфиденциальность, так и аутентификацию (AEAD).
Уязвимости и атаки
За время существования протокола было выявлено множество уязвимостей, многие из которых были устранены в новых версиях:
- Атаки на SSL 3.0 и TLS 1.0: POODLE (Padding Oracle On Downgraded Legacy Encryption), BEAST (Browser Exploit Against SSL/TLS) — атаки, использующие недостатки режимов шифрования CBC.
- Атаки на TLS 1.2: CRIME (Compression Ratio Info-leak Made Easy) — атака на сжатие данных; Lucky13 — атака на время обработки CBC-режимов.
- Атаки на сертификаты: Использование самоподписанных или скомпрометированных сертификатов, атаки на цепочки доверия (например, компрометация удостоверяющих центров).
- Атаки типа «понижение версии» (Downgrade Attack): Злоумышленник может попытаться заставить клиент и сервер использовать более старую, уязвимую версию протокола. TLS 1.3 включает механизмы защиты от таких атак (например, использование специального расширения
supported_versions).
Применение
Протокол рукопожатия TLS является основой для защиты данных в интернете. Он используется в:
- HTTPS: Защищённая версия протокола HTTP, используемая для безопасного просмотра веб-сайтов.
- SMTP, IMAP, POP3: Защита электронной почты (SMTPS, IMAPS, POP3S).
- VPN: Некоторые VPN-решения (например, OpenVPN) могут использовать TLS для установления защищённого канала.
- Другие протоколы: FTP (FTPS), SIP (SIPS), WebSocket (WSS) и многие другие.
Интересные факты
- Название «TLS» (Transport Layer Security) было выбрано IETF, чтобы подчеркнуть, что протокол работает на транспортном уровне модели OSI (между транспортным и прикладным уровнями).
- TLS 1.3 был разработан с учётом опыта предыдущих версий и сразу проектировался как более безопасный и производительный. Его внедрение происходило быстрее, чем у предшественников.
- Существует расширение TLS, называемое Session Resumption, которое позволяет клиенту и серверу возобновить ранее установленную сессию без полного рукопожатия, используя сохранённые параметры (Session ID или Session Ticket).
Источники
- RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3.
- RFC 5246 — The Transport Layer Security (TLS) Protocol Version 1.2.
- RFC 2246 — The TLS Protocol Version 1.0.
- «SSL and TLS: Designing and Building Secure Systems» by Eric Rescorla.
- «Bulletproof SSL and TLS» by Ivan Ristić.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →