Что такое выполнение рукопожатия в HTTPS?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое выполнение рукопожатия в HTTPS?
HTTPS handshake (рукопожатие) — это процесс установления защищённого соединения между клиентом и сервером перед передачей данных. Это многоэтапный протокол (TLS/SSL), который обеспечивает аутентификацию, согласование алгоритмов шифрования и обмена ключами.
Этапы TLS 1.2 handshake
1. Client Hello
- Клиент отправляет поддерживаемые версии TLS, cipher suites (комбинации алгоритмов шифрования), расширения
- Включает случайное число (client random)
2. Server Hello
- Сервер выбирает из предложенных версию TLS и cipher suite
- Отправляет свои случайное число (server random)
- Отправляет certificate (цифровой сертификат с публичным ключом)
3. Проверка сертификата
- Клиент проверяет подпись сертификата, его цепочку и сроки действия
- Использует публичный ключ из сертификата
4. Обмен ключами
- Для RSA: клиент генерирует pre-master secret, шифрует публичным ключом сервера
- Для ECDHE (более современный): обмен эфемерными ключами Диффи-Хеллмана
5. Согласование сессионного ключа
- Обе стороны используют: client random + server random + pre-master secret
- Вычисляют master secret → сессионные ключи для шифрования
6. Finished сообщения
- Обе стороны отправляют зашифрованное сообщение Finished для подтверждения
Пример временной последовательности:
Клиент Сервер
|---- ClientHello --------------------->|
|<----- ServerHello --------------------|
|<----- Certificate -------------------|
|<----- ServerKeyExchange (ECDHE) -----|
|<----- ServerHelloDone -------------|
|---- ClientKeyExchange ------------->|
|---- ChangeCipherSpec ------------->|
|---- Finished (encrypted) --------->|
|<----- ChangeCipherSpec -------------|
|<----- Finished (encrypted) ---------|
Данные зашифрованы
Ключевые компоненты безопасности
Сертификат — документ с публичным ключом, подписанный Certificate Authority. Содержит информацию о сайте, издателе, сроках действия.
Cipher suite — комбинация алгоритмов:
- Обмен ключами (RSA, ECDHE, DHE)
- Шифрование (AES, ChaCha20)
- Аутентификация (SHA-256, SHA-384)
Пример: ECDHE-RSA-AES256-GCM-SHA384
TLS 1.3 — упрощение
TLS 1.3 сократил handshake:
- Убрана опасная поддержка старых версий
- 1-RTT (1 round-trip time) вместо 2-RTT
- Предиктивные ключи для zero-RTT (быстрое возобновление)
Для C++ разработчика
Обычно используются библиотеки:
- OpenSSL — низкоуровневое управление TLS
- libcurl — высокоуровневое API с HTTPS поддержкой
- Boost.Asio — асинхронные сокеты с SSL/TLS
// Пример с OpenSSL
SSL_CTX* ctx = SSL_CTX_new(TLS_client_method());
SSL* ssl = SSL_new(ctx);
SSL_connect(ssl); // Выполнить handshake
Почему это важно?
Handshake обеспечивает:
- Конфиденциальность — данные зашифрованы
- Целостность — невозможно подменить данные
- Аутентификацию — сервер доказывает свою личность
Осторожность: неправильная настройка SSL/TLS — частая причина уязвимостей в production приложениях.