Как на самом деле работают HTTPS и TLS: практическое руководство
Вы наверняка видели значок замка в браузере и знаете, что он означает «безопасно». Но что на самом деле происходит, когда вы заходите на сайт с HTTPS? Откуда браузер знает, что общается с настоящим сервером, а не с самозванцем? И почему TLS иногда замедляет работу? Это руководство разбирает HTTPS и TLS на практических примерах, чтобы вы могли уверенно настраивать, отлаживать и защищать свои веб-приложения.
Что такое HTTPS на самом деле
HTTPS — это просто HTTP поверх TLS (Transport Layer Security). TLS обеспечивает три гарантии:
- Конфиденциальность: данные шифруются, чтобы подслушивающие не могли их прочитать.
- Целостность: данные не могут быть изменены при передаче незаметно.
- Аутентификация: сервер доказывает свою подлинность с помощью сертификата.
Без TLS протокол HTTP передаёт всё в открытом виде: пароли, куки и личные данные видны любому на сетевом пути. HTTPS решает эту проблему.
Рукопожатие TLS простыми словами
Прежде чем пойдут зашифрованные данные, клиент и сервер выполняют рукопожатие, чтобы согласовать ключи шифрования и проверить подлинность. Вот что происходит при типичном рукопожатии TLS 1.3 (современный стандарт):
- Client Hello: браузер отправляет список поддерживаемых шифров, версий TLS и случайное значение.
- Server Hello: сервер выбирает шифр, отправляет своё случайное значение и предоставляет цепочку сертификатов.
- Обмен ключами: обе стороны используют алгоритм обмена ключами (например, ECDHE), чтобы вывести общий секрет, никогда не передавая его напрямую.
- Проверка сертификата: клиент проверяет сертификат сервера по доверенным корневым ЦС, проверяет доменное имя и срок действия.
- Finished: обе стороны отправляют MAC для подтверждения целостности рукопожатия, и начинается передача зашифрованных данных приложения.
TLS 1.3 сокращает это до одного кругового обхода (1-RTT) и даже поддерживает возобновление 0-RTT для повторных посетителей, значительно снижая задержку по сравнению с TLS 1.2.
Сертификаты: якорь доверия
Сертификат связывает открытый ключ с доменным именем и подписан удостоверяющим центром (CA). Браузеры и операционные системы поставляются с хранилищем доверенных корневых ЦС. Когда сервер предъявляет свой сертификат, клиент проверяет цепочку до доверенного корня.
Распространённые типы сертификатов:
- DV (Domain Validated): подтверждает контроль над доменом; выдаётся быстро и часто бесплатно (например, Let's Encrypt).
- OV (Organization Validated): включает проверенные данные организации; выпускается дольше.
- EV (Extended Validation): highest уровень проверки; исторически показывал зелёную строку, но современные браузеры больше не акцентируют на этом внимание.
Сертификаты истекают, поэтому автоматизация необходима. Инструменты вроде Certbot или ACME-клиенты, интегрированные с вашим обратным прокси, автоматически продлевают сертификаты.
Настройка 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';
ssl_prefer_server_ciphers off;
# HSTS (включайте после тестирования)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://localhost:3000;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
Ключевые моменты: используйте только TLS 1.2 и 1.3, предпочитайте шифры ECDHE для прямой секретности и перенаправляйте HTTP на HTTPS. HSTS указывает браузерам всегда использовать HTTPS для вашего домена, но тщательно протестируйте перед включением с большим max-age.
Распространённые ошибки и как их избежать
- Смешанный контент: загрузка HTTP-ресурсов на HTTPS-странице ломает замок. Используйте относительные URL или убедитесь, что все ресурсы загружаются по HTTPS.
- Просроченные сертификаты: автоматизируйте продление и следите за сроками. Просроченный сертификат вызывает немедленные предупреждения в браузере.
- Слабые протоколы: отключите TLS 1.0 и 1.1; они устарели и уязвимы.
- Неполные цепочки сертификатов: серверы должны отправлять промежуточные сертификаты; иначе некоторые клиенты не смогут подключиться. Используйте инструменты вроде SSL Labs для проверки.
- Отсутствие HSTS preload: для максимальной защиты добавьте ваш домен в список HSTS preload после того, как убедитесь, что все поддомены поддерживают HTTPS.
TLS 1.2 против TLS 1.3: что изменилось
| Функция | TLS 1.2 | TLS 1.3 |
|---|---|---|
| Круговые обходы рукопожатия | 2-RTT | 1-RTT (0-RTT с возобновлением) |
| Обмен ключами | RSA или ECDHE | Только ECDHE (прямая секретность обязательна) |
| Шифры | Много, включая слабые | Сокращённый набор, все AEAD |
| Данные 0-RTT | Не поддерживается | Поддерживается (с риском повторного воспроизведения) |
TLS 1.3 быстрее и проще, удалены устаревшие алгоритмы. Большинство современных клиентов поддерживают его, но сохраняйте TLS 1.2 для старых устройств.
Отладка проблем TLS
Когда HTTPS не работает, проверьте следующее:
- Используйте
openssl s_client -connect example.com:443 -servername example.comдля проверки цепочки сертификатов и рукопожатия. - Выполните
curl -vI https://example.com, чтобы увидеть согласованные версию TLS и шифр. - Проверьте логи сервера на ошибки рукопожатия; Nginx записывает ошибки SSL в лог ошибок.
- Используйте онлайн-тестеры SSL для получения общей оценки и рекомендаций.
Если вы регулярно работаете с логами Nginx, Анализатор логов Nginx поможет быстро выявить сбои рукопожатия TLS и другие проблемы.
Часто задаваемые вопросы
В чём разница между HTTPS и TLS?
HTTPS — это HTTP поверх TLS. TLS — криптографический протокол, обеспечивающий шифрование, целостность и аутентификацию. HTTPS — безопасная версия HTTP, использующая TLS.
Нужен ли сертификат для внутренних сервисов?
Да, для production внутренних сервисов используйте сертификаты от собственного ЦС или публичного ЦС. Самоподписанные сертификаты вызывают проблемы с доверием; рассмотрите использование частной PKI или инструментов вроде mkcert для разработки.
Как часто нужно обновлять сертификаты?
Современная лучшая практика — 90-дневные сертификаты с автоматическим продлением, как предлагает Let's Encrypt. Более короткие сроки снижают риск при компрометации ключа.
Готовы защитить свой сайт? Начните с проверки текущей конфигурации TLS с помощью SSL-тестера, затем примените настройки Nginx выше. Для более глубокого погружения в веб-безопасность изучите наши другие руководства по OWASP Top 10 и предотвращению XSS.