Что такое HTTPS и как работает защищённое соединение
HTTPS — это HTTP поверх TLS. Разбираем рукопожатие TLS, роль сертификатов, HSTS и отличие от HTTP.
HTTPS (HyperText Transfer Protocol Secure) — это протокол передачи данных, в котором HTTP работает поверх TLS (Transport Layer Security). TLS шифрует соединение между браузером и сервером, чтобы третья сторона не могла прочитать или подменить данные.
Без HTTPS пароли, cookies и личные данные передаются в открытом виде. С HTTPS те же данные зашифрованы, а сертификат подтверждает подлинность сервера.
Как работает TLS
Когда браузер подключается к https://example.com, происходит TLS-рукопожатие:
- ClientHello — браузер отправляет список поддерживаемых алгоритмов шифрования и случайное число.
- ServerHello — сервер выбирает алгоритмы, отправляет сертификат и случайное число.
- Проверка сертификата — браузер проверяет, что сертификат выдан доверенным центром (CA), не истёк и соответствует домену.
- Обмен ключами — браузер и сервер вычисляют общий ключ сессии, не передавая его по сети.
- Шифрование — все последующие данные шифруются этим ключом.
В TLS 1.3 рукопожатие оптимизировано до одной передачи в каждую сторону, что ускоряет установку соединения.
Проверить сертификат домена можно через инструмент проверки SSL.
Версии TLS
Протокол TLS развивался поэтапно: SSL 3.0 (устарел и небезопасен), TLS 1.0 и 1.1 (устарели), TLS 1.2 (широко используется), TLS 1.3 (современный стандарт). Основные браузеры и серверы поддерживают TLS 1.2 и 1.3. Версии ниже 1.2 отключены в большинстве современных браузеров из-за известных уязвимостей.
TLS 1.3 отличается от 1.2 не только быстрее рукопожатием, но и обязательной совершенной прямой секретностью (forward secrecy): компрометация долговременного ключа не раскрывает ранее перехваченный трафик. В TLS 1.2 прямая секретность возможна, но зависит от выбранных шифров.
Проверить, какие версии TLS поддерживает сервер, можно через openssl:
openssl s_client -connect example.com:443 -tls1_2 </dev/null 2>/dev/null | grep Protocol
openssl s_client -connect example.com:443 -tls1_3 </dev/null 2>/dev/null | grep Protocol
Если сервер не поддерживает TLS 1.2 или 1.3, часть клиентов не сможет подключиться. Включайте TLS 1.3 и оставляйте 1.2 для совместимости, пока не убедитесь, что все клиенты обновились.
Роль сертификата
Сертификат — это документ, который связывает доменное имя с публичным ключом сервера. Он подписан центром сертификации (CA), которому доверяет браузер.
Сертификат содержит:
- Имя домена (Common Name) и дополнительные имена (SAN).
- Имя издателя (CA).
- Срок действия (valid from / valid until).
- Публичный ключ.
Без действительного сертификата браузер показывает предупреждение «небезопасное соединение». Проверить срок и имена сертификата можно через проверку SSL.
HSTS: защита от понижения
HSTS (HTTP Strict Transport Security) — заголовок, который заставляет браузер использовать HTTPS в течение заданного времени:
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age=31536000— использовать HTTPS в течение года.includeSubDomains— применять ко всем поддоменам.
Без HSTS злоумышленник может перенаправить пользователя на http:// версию сайта и перехватить данные. Проверить наличие HSTS и других заголовков безопасности можно через анализатор заголовков безопасности.
HTTP vs HTTPS
| Свойство | HTTP | HTTPS |
|---|---|---|
| Шифрование | Нет | TLS |
| Сертификат | Не требуется | Нужен от доверенного CA |
| Порт по умолчанию | 80 | 443 |
| HSTS | Не работает | Работает |
| Индексация | Понижается в поиске | Предпочтителен |
Типичные ошибки
- Сертификат истёк. Браузер показывает предупреждение. Проверьте срок заранее через проверку SSL.
- Нет HSTS. Пользователь может быть перенаправлен на HTTP. Добавьте
Strict-Transport-Securityзаголовок. - Mixed content. Страница загружается по HTTPS, но ресурсы (картинки, скрипты) — по HTTP. Браузер блокирует их.
- Сертификат не покрывает www. Если SAN не включает
www.example.com, пользователи увидят ошибку при доступе через www.
Практический пример
Для включения HTTPS на сервере с доменом example.com:
- Получите сертификат у Let's Encrypt (бесплатно) или вашего регистратора.
- Настройте веб-сервер (Nginx/Apache) для отдачи HTTPS на порту 443.
- Настройте редирект с HTTP (порт 80) на HTTPS.
- Добавьте заголовок HSTS:
Strict-Transport-Security: max-age=31536000; includeSubDomains. - Проверьте сертификат через проверку SSL.
- Проверьте заголовки безопасности через анализатор.
После настройки убедитесь, что все ресурсы на странице загружаются по HTTPS, иначе браузер заблокирует mixed content.
Частые вопросы
Чем HTTPS отличается от HTTP?
HTTPS — это HTTP поверх TLS. TLS шифрует данные между браузером и сервером, а сертификат подтверждает, что сервер принадлежит тому, за кого себя выдаёт. HTTP передаёт данные открыто.
Что такое TLS-рукопожатие?
TLS-рукопожатие — это процесс, при котором браузер и сервер согласовывают алгоритмы шифрования, проверяют сертификат и создают общий ключ. В TLS 1.3 рукопожатие требует одной сетевой передачи в каждую сторону.
Достаточно ли HTTPS для безопасности сайта?
HTTPS защищает соединение, но не защищает от уязвимостей в коде, слабых паролей или отсутствия заголовков безопасности. Проверьте CSP, HSTS и другие заголовки через анализатор безопасности.