← Назад к вопросам

Что такое HTTPS Handshake?

1.0 Junior🔥 72 комментариев
#Другое#Коллекции и структуры данных

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Протокол HTTPS Handshake

HTTPS Handshake (рукопожатие HTTPS) — это процесс установления защищённого соединения между клиентом (обычно веб-браузером) и сервером по протоколу HTTPS (HTTP over SSL/TLS). Основная цель — безопасный обмен данными через асимметричное шифрование, взаимную аутентификацию и создание общих симметричных ключей для быстрого шифрования трафика.

Этапы Handshake в деталях

1. Client Hello

Клиент отправляет серверу сообщение, содержащее:

  • Поддерживаемые версии TLS (например, TLS 1.2, TLS 1.3).
  • Случайное число (client random), используемое позже для генерации ключей.
  • Список поддерживаемых шифров (cipher suites).
  • Список методов сжатия (опционально).
  • Имя сервера (Server Name Indication, SNI), если виртуальный хостинг.
// Пример структуры ClientHello (концептуально)
public class ClientHello
{
    public byte[] ClientRandom { get; set; }
    public List<TlsVersion> SupportedVersions { get; set; }
    public List<CipherSuite> CipherSuites { get; set; }
    public string ServerName { get; set; }
}

2. Server Hello

Сервер отвечает, выбирая параметры соединения:

  • Версия TLS.
  • Шифр (cipher suite) из предложенных клиентом.
  • Случайное число сервера (server random).
  • Сертификат сервера (обычно X.509), содержащий публичный ключ.
  • (Опционально) Запрос сертификата клиента для двусторонней аутентификации (mTLS).

3. Аутентификация и обмен ключами

Клиент проверяет сертификат сервера:

  • Проверка цепочки доверия до корневого центра сертификации (CA).
  • Проверка срока действия и доменного имени.
  • Извлечение публичного ключа сервера.

Затем клиент генерирует pre-master secret, шифрует его публичным ключом сервера и отправляет в Client Key Exchange. В TLS 1.3 эта часть оптимизирована с использованием Diffie-Hellman.

4. Завершение Handshake

Обе стороны на основе client random, server random и pre-master secret вычисляют master secret, а из него — сессионные ключи для симметричного шифрования (AES, ChaCha20) и MAC (Message Authentication Code). Отправляются сообщения Change Cipher Spec и Finished для подтверждения, что всё прошло успешно.

Пример на C# с использованием HttpClient

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class HttpsExample
{
    public async Task ConnectToHttpsServerAsync()
    {
        var handler = new HttpClientHandler
        {
            // Проверка сертификата (можно настроить кастомную логику)
            ServerCertificateCustomValidationCallback = (sender, cert, chain, errors) =>
            {
                // В production здесь должна быть строгая проверка
                return errors == System.Net.Security.SslPolicyErrors.None;
            }
        };

        using var client = new HttpClient(handler);
        
        try
        {
            var response = await client.GetAsync("https://example.com");
            // Handshake произошёл автоматически перед отправкой запроса
        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine($"Ошибка handshake или соединения: {ex.Message}");
        }
    }
}

Ключевые аспекты для back-end разработчика

  • Производительность: Handshake добавляет задержку (1-2 RTT). Для минимизации используют TLS session resumption (сессионные билеты или RESUME).
  • Безопасность: Важно выбирать актуальные версии TLS (1.2/1.3), отключать устаревшие шифры (RC4, DES) и использовать стойкие алгоритмы (ECDHE, AES-GCM).
  • Сертификаты: Необходимы корректно подписанные сертификаты от доверенных CA или правильно настроенные самоподписанные для внутренних сервисов.
  • Оптимизации в TLS 1.3: Handshake сокращён до одного RTT, удалены уязвимые алгоритмы, улучшена безопасность.

Влияние на архитектуру back-end

  1. Termination TLS: Часто handshake обрабатывается на балансировщике (nginx, HAProxy) или в облачном сервисе (AWS ALB), чтобы разгрузить прикладные серверы.
  2. mTLS (mutual TLS): Для микросервисной архитектуры используется двусторонняя аутентификация, где и клиент, и сервер предоставляют сертификаты.
  3. Certificate Pinning: Для повышения безопасности можно «привязывать» ожидаемый сертификат на клиенте.

Handshake — фундаментальный процесс, обеспечивающий конфиденциальность и целостность данных в современных веб-приложениях. Понимание его работы критично для построения безопасных и производительных back-end систем.