Как на самом деле работают HTTPS и TLS: рукопожатие и сертификаты
Почему HTTPS важен (и почему его неправильно понимают)
Вы наверняка видели значок замка в браузере и предполагали, что сайт «безопасен». Но что это на самом деле значит? HTTPS — это не только шифрование; это идентификация, целостность и доверие. Многие разработчики относятся к TLS как к чёрному ящику — настраивают один раз и забывают. Это приводит к ошибкам конфигурации, просроченным сертификатам и уязвимым наборам шифров.
В этой статье мы разберём, как на самом деле работают HTTPS и TLS, от рукопожатия до проверки сертификатов, и покажем, как правильно всё настроить. Без воды, только практические знания, которые можно применить сегодня.
Рукопожатие TLS: что происходит до первого байта
Когда клиент (браузер) подключается к серверу по HTTPS, они выполняют рукопожатие TLS. Это устанавливает защищённый канал. Вот упрощённая версия (TLS 1.3):
- Client Hello: Клиент отправляет поддерживаемые наборы шифров, случайное значение и ключевой обмен (для обмена ключами).
- Server Hello: Сервер выбирает набор шифров, отправляет своё случайное значение и ключевой обмен, а также представляет свою цепочку сертификатов.
- Аутентификация: Клиент проверяет сертификат сервера по доверенным центрам сертификации (CA) и проверяет имя хоста.
- Выработка ключа: Обе стороны вычисляют общий секрет с использованием ECDHE (Elliptic Curve Diffie-Hellman Ephemeral).
- Finished: Обе стороны отправляют зашифрованные сообщения «Finished» для подтверждения рукопожатия.
После этого данные приложения шифруются симметричными ключами. TLS 1.3 сокращает количество круговых обменов до одного, улучшая задержку.
Обмен ключами: ECDHE против RSA
Более старые версии TLS использовали обмен ключами RSA, который не обеспечивает прямую секретность. Если закрытый ключ сервера скомпрометирован, прошлый трафик может быть расшифрован. Современные настройки используют ECDHE, который обеспечивает прямую секретность — каждая сессия имеет уникальные ключи.
# Пример: Проверка поддерживаемых алгоритмов обмена ключами
openssl s_client -connect example.com:443 -cipher 'ECDHE'
Сертификаты: якоря доверия
Сертификат связывает открытый ключ с идентификатором (доменным именем). Он подписан центром сертификации (CA), которому доверяет клиент. Браузеры поставляются с хранилищем доверенных корневых CA.
Когда вы посещаете сайт, сервер отправляет цепочку: конечный сертификат (для вашего домена) → промежуточный CA → корневой CA. Клиент проверяет каждую подпись вплоть до доверенного корня.
Типы сертификатов
- С проверкой домена (DV): Подтверждает только контроль над доменом. Быстро и бесплатно (например, Let's Encrypt).
- С проверкой организации (OV): Включает проверенные данные организации.
- Расширенной проверки (EV): Более строгая проверка; браузеры больше не показывают зелёную строку, но некоторые предприятия всё ещё используют их.
Этапы проверки сертификата
Браузеры проверяют:
- Цепочка подписей ведёт к доверенному корню.
- Сертификат находится в пределах срока действия.
- Имя хоста совпадает (Subject Alternative Names).
- Сертификат не отозван (через OCSP или CRL).
Если какая-либо проверка не пройдена, вы получаете предупреждение. Никогда не игнорируйте эти предупреждения в производственной среде.
Настройка HTTPS на вашем сервере
Рассмотрим типичную конфигурацию Nginx для HTTPS с современными настройками TLS.
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# HSTS (использовать с осторожностью)
add_header Strict-Transport-Security "max-age=63072000" always;
}
Примечания:
- Используйте только TLS 1.2 и 1.3; отключите старые версии.
- Предпочитайте шифры ECDHE для прямой секретности.
- Включите HTTP/2 для производительности.
- HSTS заставляет браузеры использовать HTTPS; включайте только после тестирования.
Получение сертификатов с помощью Let's Encrypt
Let's Encrypt предоставляет бесплатные DV-сертификаты. Используйте Certbot для автоматизации выпуска и продления:
sudo certbot --nginx -d example.com -d www.example.com
Certbot изменяет вашу конфигурацию Nginx и настраивает задание cron для продления. Всегда тестируйте продление с помощью --dry-run.
Распространённые ошибки и как их избежать
- Просроченные сертификаты: Настройте мониторинг и автоматическое продление.
- Неполная цепочка: Включайте промежуточные сертификаты (fullchain.pem).
- Слабые шифры: Отключите RC4, DES и экспортные шифры.
- Смешанный контент: Убедитесь, что все ресурсы (изображения, скрипты) загружаются по HTTPS.
- Отсутствие HSTS: Без HSTS пользователи могут быть переведены на HTTP.
Тестирование конфигурации HTTPS
Используйте онлайн-инструменты, такие как SSL Labs, или инструменты командной строки для проверки вашей настройки.
# Проверка деталей сертификата
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text
# Проверка поддержки TLS 1.3
openssl s_client -connect example.com:443 -tls1_3
Обратите внимание на:
- Действительная цепочка сертификатов.
- Отсутствие слабых протоколов (SSLv3, TLS 1.0, TLS 1.1).
- Включена прямая секретность.
- Присутствует заголовок HSTS.
Часто задаваемые вопросы
В чём разница между TLS и SSL?
SSL — предшественник TLS. TLS 1.0 по сути был SSL 3.1. Сегодня «SSL» часто используется в разговорной речи, но всегда следует использовать TLS 1.2 или 1.3.
Нужен ли платный сертификат для HTTPS?
Нет. Бесплатные DV-сертификаты от Let's Encrypt доверены всеми основными браузерами и обеспечивают такое же шифрование, как платные. Платные сертификаты предлагают гарантии и поддержку, но шифрование идентично.
Как HTTPS влияет на производительность?
TLS добавляет задержку из-за рукопожатия, но TLS 1.3 сокращает её до одного кругового обмена. С возобновлением сеансов и HTTP/2 накладные расходы минимальны. Затраты на шифрование/дешифрование низки на современных процессорах.
Готовы проверить конфигурацию TLS вашего сервера? Используйте наш Анализатор логов Nginx, чтобы выявить необычные шаблоны трафика и убедиться, что ваша настройка HTTPS работает как ожидается.