Как работает протокол HTTPS?

«Как работает протокол HTTPS?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные этапы установки защищённого соединения (TLS Handshake):

  1. Client Hello: Браузер отправляет серверу информацию: поддерживаемые версии TLS и наборы шифров (cipher suites), а также случайное число.
  2. Server Hello: Сервер отвечает, выбирая версию TLS и cipher suite, и отправляет своё случайное число и SSL-сертификат. Этот сертификат содержит публичный ключ сервера и подписан доверенным Центром сертификации (CA).
  3. Проверка сертификата: Клиент проверяет подпись сертификата по цепочке доверия до корневого CA. Это подтверждает, что сервер является тем, за кого себя выдаёт.
  4. Обмен ключами: Клиент генерирует pre-master secret, шифрует его публичным ключом сервера из сертификата и отправляет серверу. Только сервер, обладающий соответствующим приватным ключом, может его расшифровать.
  5. Генерация сессионных ключей: И клиент, и сервер, используя оба случайных числа и pre-master secret, независимо вычисляют идентичные сессионные ключи. Эти симметричные ключи будут использоваться для шифрования всего трафика этой сессии.
  6. Завершение рукопожатия: Стороны обмениваются сообщениями, зашифрованными новыми сессионными ключами, подтверждая, что handshake прошёл успешно.

После handshake начинается обмен зашифрованными HTTP-данными с использованием быстрого симметричного шифрования (например, AES).

Пример на PHP: валидация SSL-сертификата при запросе к внешнему API

$context = stream_context_create([
    'ssl' => [
        'verify_peer' => true, // Включить проверку
        'verify_peer_name' => true, // Проверить совпадение имени хоста
        'cafile' => '/etc/ssl/certs/ca-certificates.crt', // Путь к bundle корневых CA
        'allow_self_signed' => false // Запретить самоподписанные сертификаты
    ]
]);

// Если сертификат невалиден, будет выброшено исключение
$response = file_get_contents('https://secure-api.example.com/data', false, $context);

Ключевые преимущества HTTPS:

  • Шифрование: Защита от перехвата данных (например, логинов, платежных данных).
  • Целостность: Данные не могут быть незаметно изменены при передаче (защита от MITM-атак).
  • Аутентификация: Пользователь уверен, что общается с настоящим сервером, а не с поддельным.