Как на самом деле работают HTTPS и TLS: пошаговое руководство
Вы наверняка видели значок замка в браузере и предполагали, что соединение защищено. Но что на самом деле происходит, когда вы заходите на сайт с HTTPS? Как браузер узнаёт, что общается с настоящим сервером, а не с самозванцем? И почему TLS иногда замедляет ваш сайт?
В этом руководстве мы развеем мифы о HTTPS и TLS, пошагово разобрав рукопожатие. Вы узнаете о роли сертификатов, симметричного и асимметричного шифрования, а также о том, как проверять и оптимизировать TLS в своих проектах.
Что на самом деле делают HTTPS и TLS
HTTPS — это HTTP, работающий поверх TLS (Transport Layer Security). TLS обеспечивает три гарантии:
- Конфиденциальность: данные шифруются, чтобы посторонние не могли их прочитать.
- Целостность: данные не могут быть изменены при передаче незаметно.
- Аутентификация: вы общаетесь с легитимным сервером, а не с злоумышленником.
Без TLS трафик HTTP передаётся в открытом виде. Любой на пути (точки Wi-Fi, провайдеры, скомпрометированные роутеры) может его прочитать или изменить. TLS решает эту проблему, устанавливая защищённый канал до обмена любыми HTTP-данными.
TLS-рукопожатие: шаг за шагом
Рукопожатие — это место, где происходит магия. Это переговоры, которые устанавливают общие ключи и проверяют идентичность. Вот упрощённый поток для TLS 1.2 и 1.3 (две версии, с которыми вы столкнётесь сегодня).
Шаг 1: Client Hello
Клиент (браузер) отправляет сообщение ClientHello, содержащее:
- Поддерживаемые версии TLS (например, TLS 1.3, TLS 1.2)
- Поддерживаемые наборы шифров (комбинации алгоритмов)
- Случайную строку байтов (client random)
- Для TLS 1.3 — долю ключа для обмена Диффи-Хеллмана
Шаг 2: Server Hello и сертификат
Сервер отвечает сообщением ServerHello (выбранная версия, набор шифров, server random) и своим сертификатом. Сертификат содержит открытый ключ сервера и подписан удостоверяющим центром (CA).
Клиент проверяет сертификат: не истёк ли срок действия? Выдан ли он доверенным CA? Совпадает ли домен? Если нет, браузер показывает предупреждение.
Шаг 3: Обмен ключами
Используя открытый ключ сервера (или параметры Диффи-Хеллмана), клиент и сервер выводят общий pre-master secret. В TLS 1.3 это делается с помощью эфемерного Диффи-Хеллмана (ECDHE), обеспечивая прямую секретность: даже если закрытый ключ сервера позже будет скомпрометирован, прошлые сеансы останутся защищёнными.
Шаг 4: Finished
Обе стороны отправляют сообщение Finished, зашифрованное новыми производными ключами. Если расшифровка успешна, рукопожатие завершено. С этого момента все данные приложения (HTTP) шифруются симметричным шифрованием (например, AES-GCM или ChaCha20-Poly1305).
Улучшения в TLS 1.3
TLS 1.3 сокращает рукопожатие до одного кругового обхода (1-RTT) и поддерживает возобновление 0-RTT для повторных посетителей. Он также удаляет устаревшие алгоритмы, делая его быстрее и безопаснее. Большинство современных браузеров и серверов поддерживают TLS 1.3.
Симметричное и асимметричное шифрование в TLS
TLS использует оба типа шифрования по уважительной причине:
- Асимметричное (открытого ключа) шифрование: используется во время рукопожатия для аутентификации сервера и безопасного обмена ключами. Оно вычислительно затратно, но решает проблему распределения ключей.
- Симметричное шифрование: используется для массовой передачи данных после рукопожатия. Оно быстрое и эффективное.
Этот гибридный подход даёт вам безопасность криптографии с открытым ключом и производительность симметричных шифров.
Сертификаты: якоря доверия
Сертификат связывает открытый ключ с доменным именем и подписан CA. Браузеры и операционные системы поставляются с хранилищем доверенных корневых CA. Когда сервер представляет свой сертификат, клиент строит цепочку доверия к доверенному корню.
Сертификаты имеют ограниченный срок действия (сейчас часто 90 дней с Let's Encrypt). Просроченные сертификаты вызывают ошибки в браузере, поэтому автоматизируйте продление.
Практика: проверка TLS с помощью OpenSSL
Вы можете проверить конфигурацию TLS сервера с помощью утилиты командной строки openssl. Это помогает отлаживать сбои рукопожатия или проверять наборы шифров.
openssl s_client -connect example.com:443 -servername example.com -tls1_3
Эта команда подключается к серверу и выводит цепочку сертификатов, согласованный шифр и сведения о сеансе. Ищите Verify return code: 0 (ok), чтобы убедиться, что сертификат действителен.
Чтобы проверить срок действия сертификата:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
Распространённые ошибки TLS и как их избежать
- Просроченные сертификаты: настройте автоматическое продление и мониторинг. Используйте инструменты вроде Certbot для Let's Encrypt.
- Смешанный контент: загрузка HTTP-ресурсов на странице HTTPS нарушает безопасность. Используйте относительные URL или убедитесь, что все ресурсы загружаются по HTTPS.
- Слабые наборы шифров: отключите устаревшие протоколы (TLS 1.0, 1.1) и слабые шифры (RC4, 3DES). Включите TLS 1.3.
- Отсутствие HSTS: добавьте заголовок
Strict-Transport-Security, чтобы принудительно использовать HTTPS для будущих посещений. - Неполные цепочки сертификатов: некоторые серверы забывают включить промежуточные сертификаты, что вызывает ошибки у некоторых клиентов. Используйте SSL Labs для проверки.
Оптимизация производительности TLS
TLS добавляет задержку из-за рукопожатия. Вот как её минимизировать:
- Включите TLS 1.3, у которого более быстрое рукопожатие.
- Используйте возобновление сеанса (сеансовые билеты или предварительные ключи), чтобы избежать полных рукопожатий для повторных посетителей.
- Включите OCSP stapling, чтобы снизить задержку проверки сертификата.
- Используйте CDN с терминацией TLS на периферии, чтобы сократить время кругового обхода.
- Держите сертификаты небольшими (используйте ECDSA вместо RSA, где это возможно).
Часто задаваемые вопросы
В чём разница между HTTPS и TLS?
HTTPS — это защищённая версия HTTP, а TLS — криптографический протокол, обеспечивающий безопасность. HTTPS использует TLS для шифрования и аутентификации соединения.
Как TLS обеспечивает прямую секретность?
Прямая секретность гарантирует, что даже если закрытый ключ сервера скомпрометирован, прошлые сеансовые ключи не могут быть восстановлены. Это достигается использованием эфемерного обмена ключами Диффи-Хеллмана (ECDHE) в TLS 1.3 и современных конфигурациях TLS 1.2.
Почему я вижу ошибки сертификатов на некоторых сайтах?
Ошибки сертификатов обычно означают, что сертификат просрочен, самоподписан, выдан для другого домена или цепочка сертификатов неполна. Браузеры отклоняют такие сертификаты, чтобы защитить вас от атак «человек посередине».
Когда вам нужно проверить или отладить TLS-соединения, инструменты вроде Timestamp Converter помогут расшифровать сроки действия сертификатов и отладить проблемы, связанные со временем.