Как HTTPS и TLS работают на самом деле: практическое руководство
Вы наверняка видели значок замка в браузере и предполагали, что он означает безопасность сайта. Но что на самом деле происходит, когда вы заходите на HTTPS-адрес? Почему некоторые сертификаты вызывают предупреждения? И как понять, действительно ли соединение зашифровано от начала до конца? Это руководство объясняет HTTPS и TLS на практических примерах: показывает этапы рукопожатия, как проверяются сертификаты и как инспектировать реальные соединения с помощью командной строки. К концу вы будете достаточно хорошо понимать механику, чтобы отлаживать проблемы TLS и принимать обоснованные решения о безопасности своего веб-сайта.
Что на самом деле представляет собой HTTPS
HTTPS — это HTTP, работающий поверх TLS (Transport Layer Security). TLS обеспечивает три гарантии:
- Конфиденциальность: данные шифруются, чтобы подслушивающие не могли их прочитать.
- Целостность: данные не могут быть изменены при передаче незаметно.
- Аутентификация: вы общаетесь с сервером, владеющим доменом, а не с самозванцем.
Без TLS HTTP передаёт всё в открытом виде — пароли, куки и контент — по сети. TLS оборачивает этот трафик в зашифрованный туннель. Замок означает, что соединение зашифровано и сертификат действителен, но не означает, что сайт заслуживает доверия или безопасен в других отношениях (например, на нём всё ещё могут быть уязвимости).
TLS-рукопожатие простыми словами
Перед обменом любыми HTTP-данными клиент и сервер выполняют TLS-рукопожатие. Точные шаги немного различаются в TLS 1.2 и 1.3, но основная идея одна: согласовать алгоритмы, аутентифицировать сервер и установить общие ключи. Вот упрощённая последовательность для TLS 1.3 (современный стандарт):
- Client Hello: клиент отправляет список поддерживаемых шифровых наборов, случайное значение и ключевую долю (для обмена ключами).
- Server Hello: сервер выбирает шифровой набор, отправляет своё случайное значение и ключевую долю, а также предоставляет цепочку сертификатов.
- Проверка сертификата: клиент проверяет срок действия сертификата, доменное имя и цепочку доверия.
- Выработка ключей: обе стороны вычисляют общий секрет с помощью Диффи-Хеллмана (часто X25519). На его основе выводятся симметричные сеансовые ключи.
- Finished: обе стороны отправляют MAC по стенограмме рукопожатия, чтобы подтвердить, что ничего не было подменено.
После рукопожатия данные приложения (HTTP-запросы и ответы) шифруются сеансовыми ключами. TLS 1.3 сокращает рукопожатие до одного кругового обмена (1-RTT) и поддерживает возобновление 0-RTT, что делает его быстрее TLS 1.2.
Проверка сертификатов: как браузер решает доверять сайту
Когда сервер отправляет свой сертификат, клиент должен его проверить. Браузер (или ваш HTTP-клиент) выполняет несколько проверок:
- Цепочка доверия: сертификат должен быть подписан доверенным удостоверяющим центром (CA) или промежуточным CA, который выстраивается к корневому CA в хранилище доверия клиента.
- Доменное имя: Subject Alternative Name (SAN) сертификата должен включать имя хоста, к которому вы подключаетесь.
- Срок действия: сертификат не должен быть просрочен или ещё не вступить в силу.
- Отзыв: клиент может проверить OCSP или CRL, чтобы узнать, не отозван ли сертификат (хотя это часто делается по возможности).
Если какая-либо проверка не проходит, браузер показывает предупреждение. Например, самоподписанный сертификат вызывает сообщение "Ваше подключение не защищено", потому что он не подписан доверенным CA.
Инспекция реального TLS-соединения
Вы можете сами увидеть детали рукопожатия с помощью OpenSSL. Выполните эту команду в терминале (замените имя хоста):
openssl s_client -connect example.com:443 -servername example.com -showcerts
Вывод включает цепочку сертификатов, согласованный шифр и версию TLS. Ищите строки вроде:
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Это означает, что соединение использует TLS 1.3 с AES-256-GCM. Также можно использовать curl -v https://example.com, чтобы увидеть сводку TLS-рукопожатия.
Распространённые ошибки конфигурации TLS и как их обнаружить
Даже при включённом HTTPS ошибки конфигурации могут ослабить безопасность. Вот частые проблемы:
| Проблема | Риск | Как проверить |
|---|---|---|
| Слабые протоколы (TLS 1.0/1.1) | Уязвимы к известным атакам | openssl s_client -tls1_1 -connect host:443 должен завершиться ошибкой |
| Просроченный сертификат | Предупреждения браузера, нарушение доверия | Проверьте срок действия с помощью openssl s_client | openssl x509 -noout -dates |
| Отсутствие промежуточных сертификатов | Некоторые клиенты не могут проверить | Используйте -showcerts и проверьте полноту цепочки |
| Нет заголовка HSTS | Возможны атаки понижения версии | Проверьте наличие заголовка Strict-Transport-Security |
Исправление обычно включает обновление конфигурации сервера (например, в Nginx: ssl_protocols TLSv1.2 TLSv1.3;) и обеспечение полноты цепочки сертификатов.
HTTPS на практике: что делать разработчикам
- Используйте только TLS 1.2 или 1.3; отключите старые версии.
- Получайте сертификаты от доверенного CA (Let's Encrypt бесплатен и автоматизирован).
- Включите HSTS, чтобы принудительно использовать HTTPS.
- Регулярно продлевайте сертификаты и следите за сроками.
- Тестируйте конфигурацию с помощью инструментов вроде SSL Labs (qualys.com/ssllabs) или
testssl.sh.
Если вы отлаживаете серверные логи, Nginx Log Analyzer поможет выявить сбои TLS-рукопожатия и ошибки сертификатов в логах доступа.
FAQ
В чём разница между TLS и SSL?
SSL — предшественник TLS. SSL 2.0 и 3.0 устарели и небезопасны; современные системы используют TLS 1.2 или 1.3. Люди часто говорят "SSL" в обиходе, но имеют в виду TLS.
Делает ли HTTPS сайт полностью безопасным?
Нет. HTTPS шифрует трафик и аутентифицирует сервер, но не защищает от уязвимостей вроде SQL-инъекций, XSS или неправильно настроенных прав доступа. Это лишь один уровень безопасности.
Как проверить, поддерживает ли сайт TLS 1.3?
Используйте openssl s_client -connect host:443 -tls1_3. Если рукопожатие успешно, TLS 1.3 поддерживается. Также можно посмотреть протокол в инструментах разработчика браузера на вкладке "Безопасность".
Понимание TLS-рукопожатия и проверки сертификатов помогает создавать и поддерживать безопасные веб-сервисы. Когда нужно проанализировать серверные логи на наличие ошибок TLS или проблем с производительностью, попробуйте Nginx Log Analyzer, чтобы быстро разбирать и фильтровать записи логов.