Урок 7 — HTTPS и TLS
Замочек 🔒 в адресной строке. Что он значит? Как браузер «знает», что сайт настоящий, и почему никто не может подглядеть твой пароль на пути от Лондона до Франкфурта? Это работа TLS.
- Зачем нужен HTTPS
- Три гарантии TLS
- Минимум криптографии: симметричное и асимметричное
- Что такое сертификат
- Кто такие CA и почему им доверяют
- TLS handshake шаг за шагом
- Let's Encrypt и автоматизация
- mTLS — взаимная аутентификация
- Что с этим делает DevOps
- Команды и упражнения
- Чек-лист
- Задачи с ответами
HTTP — текстовый разговор клиента и сервера поверх TCP-соединения (уроки 4 и 6), и весь этот
разговор по умолчанию виден каждому узлу на пути пакета — а узлов, как ты видел в
traceroute, добрый десяток. Сегодняшний урок — про то, как поверх той же трубы
построили «бронированный туннель», не поменяв ни HTTP, ни TCP. Приготовься: будет немного
криптографии, но ровно столько, сколько нужно инженеру.
1. Зачем нужен HTTPS
В уроке 6 мы видели, как HTTP-запрос — это обычный текст. Кто-то с доступом к каналу (Wi-Fi в кафе, провайдер, государство) видит всё: твои пароли, переписку, банковские данные. Это не приемлемо.
HTTPS = HTTP + TLS. TLS — это «прозрачная труба шифрования». HTTP-запрос идёт сначала в TLS, тот шифрует и передаёт. На той стороне TLS расшифровывает и отдаёт HTTP-серверу. Само HTTP-приложение даже не знает, что выше есть шифрование.
2. Три гарантии TLS
Когда ты видишь 🔒 в браузере, TLS обеспечивает три вещи. Запомни их — это сердце всей криптографии:
🤐 1. Конфиденциальность
Никто посередине не прочитает содержимое. Даже провайдер видит только «куда» (по IP) и «сколько байт», но не «что».
🛡️ 2. Целостность
Никто не подменит данные «по дороге». Если хоть бит изменили — приёмник заметит и отбросит.
🪪 3. Аутентификация
Ты точно знаешь, что разговариваешь с настоящим example.com, а не с подделкой. Это делают сертификаты.
📌 (Бонус) Forward Secrecy
Даже если кто-то записал твой трафик сегодня и украл ключ через год — он не сможет его расшифровать. Так настроены TLS 1.3 по умолчанию.
3. Минимум криптографии
Чтобы понять TLS, нужно различать два типа шифрования.
Симметричное
Один ключ — и для шифрования, и для расшифровки. Быстро, эффективно. Алгоритмы: AES, ChaCha20.
Симметричное = замок и один ключ на двоих
У тебя и у друга — копии одного ключа. Закрыли — открыли. Просто и быстро. Проблема: как передать ключ? Если враг по пути перехватит ключ, всё прозрачно.
Асимметричное (public-key)
Два ключа: приватный (тайный, никогда не покидает владельца) и публичный (можно отдавать всем). Что зашифровано публичным — расшифровывается только приватным. Алгоритмы: RSA, ECDSA.
Асимметричное = открытый почтовый ящик и ключ у владельца
Ты вешаешь на стену почтовый ящик с щелью. Любой может бросить туда письмо (зашифровать публичным ключом). Только ты с ключом от ящика можешь его открыть (расшифровать приватным).
Минус — асимметрия дорогая: в 100-1000 раз медленнее симметричной. Поэтому в TLS её используют только для одного — безопасно договориться о симметричном ключе, а дальше шифруют им.
Цифровая подпись
Обратная задача: приватный ключ «подписывает», публичный — проверяет подпись. Это доказательство, что документ создал именно владелец приватного ключа. Используется в сертификатах.
4. Что такое сертификат
Сертификат — это файл, который содержит:
- Доменное имя (для кого выпущен):
example.com - Публичный ключ сервера
- Срок действия (от — до)
- Кто выпустил (Issuer)
- Подпись того, кто выпустил
Когда клиент получает этот файл, он:
- Проверяет имя — совпадает ли с тем, к кому он идёт
- Проверяет срок — не истёк ли
- Проверяет подпись — настоящий ли это сертификат
Если хоть один шаг провалился — браузер показывает страшное предупреждение.
5. Кто такие CA и почему им доверяют
CA — Certificate Authority (центр сертификации). Это компания/организация, которая выдаёт сертификаты. Известные CA: Let's Encrypt, DigiCert, Sectigo, GlobalSign, AWS ACM.
Как браузер знает, что CA — настоящий?
В каждой ОС / браузере вшит набор «корневых» CA-сертификатов — это trust store. На macOS — в Keychain. На Linux — в /etc/ssl/certs/. На Windows — в системе. Их там пара сотен.
Промежуточные CA нужны для безопасности — если их ключ скомпрометируется, отозвать можно отдельно, не трогая корневой. Корневые ключи хранят оффлайн в специальных HSM-устройствах.
6. TLS handshake шаг за шагом
Когда браузер открывает HTTPS-сайт, перед обменом HTTP-данными происходит «знакомство» — TLS handshake. В TLS 1.3 это 1 RTT (round-trip):
Ключевая магия — обмен ключами Диффи-Хеллмана (ECDHE в TLS 1.3). Не вдаваясь в математику: благодаря свойствам асимметричной криптографии, две стороны могут публично обменяться сообщениями и в результате прийти к общему секрету, которого никто посередине не сможет вычислить, даже если запишет все сообщения.
А сертификат тут зачем? Чтобы клиент удостоверился, что разговаривает с настоящим сервером, а не с MITM-прокладкой, которая тоже честно делает Diffie-Hellman.
7. Let's Encrypt и автоматизация
Раньше сертификаты стоили $50-500 в год и выпускались вручную через email-подтверждение. С 2015 года Let's Encrypt раздаёт сертификаты бесплатно и автоматически. Это перевернуло индустрию: сейчас 90%+ сайтов в мире на HTTPS.
Принцип ACME-протокола: ты доказываешь Let's Encrypt, что владеешь доменом, и через 30 секунд получаешь сертификат на 90 дней. Перед истечением — продлеваешь автоматически.
Способы подтверждения владения:
- HTTP-01: положи файл по адресу
http://example.com/.well-known/acme-challenge/<token> - DNS-01: добавь TXT-запись
_acme-challenge.example.com - TLS-ALPN-01: подними TLS-обработчик специального ALPN-протокола
В DevOps-практике:
- На сервере — certbot: ставится одной командой, обновляет автоматически
- В Kubernetes — cert-manager: оператор, выпускает сертификаты по аннотациям
- В AWS — ACM: бесплатные сертификаты, привязываются к ALB / CloudFront
8. mTLS — взаимная аутентификация
Обычный TLS аутентифицирует только сервер. Клиент анонимен (или аутентифицируется через Authorization-заголовок поверх TLS).
В mTLS (mutual TLS) обе стороны предъявляют сертификаты. Сервер тоже проверяет клиента. Это идеально для:
- Service mesh (Istio, Linkerd) — каждый микросервис аутентифицируется сертификатом
- Zero Trust — идентичность сервиса = сертификат, а не IP
- API между партнёрами — не пароли в Vault, а сертификаты
Это твой хлеб как DevSecOps. Запомни и приходи позже.
9. Что с этим делает DevOps
- Получение и продление сертификатов. certbot, cert-manager, ACM. Автоматизация — обязательна. Сертификаты истекают — и сайт ложится.
- TLS termination на LB. Обычно расшифровку делает Load Balancer (ALB, Nginx ingress), а в приватной сети дальше идёт HTTP — это эффективнее.
- End-to-end шифрование. Для самых строгих требований TLS идёт «насквозь» — от клиента до приложения. mTLS в service mesh решает эту задачу.
- Мониторинг истечения. Алёрты типа «сертификат истекает через 7 дней» — обязательны. Иначе на праздниках всё ляжет.
- HSTS, security headers. Включаешь HSTS — браузер запоминает, что сайт всегда по HTTPS, и не позволяет downgrade-атаку.
- TLS versions. Отключай TLS 1.0/1.1 в продакшене. Только 1.2 и 1.3.
- CAA-записи в DNS. Чтобы атакующий не выпустил сертификат на твой домен у другого CA.
10. Команды и упражнения
Посмотреть сертификат сайта
# Показать сертификат и цепочку
openssl s_client -connect example.com:443 -servername example.com < /dev/null
# Только полезная информация — даты, имя, эмитент
echo | openssl s_client -connect example.com:443 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -text
# Узнать, когда истекает (одной строкой)
echo | openssl s_client -connect example.com:443 2>/dev/null \
| openssl x509 -noout -dates
# Полная цепочка
openssl s_client -connect example.com:443 -showcerts < /dev/null
Проверить, какие TLS-версии поддерживает сервер
# Попытка по разным версиям
openssl s_client -connect example.com:443 -tls1_2 < /dev/null
openssl s_client -connect example.com:443 -tls1_3 < /dev/null
# Внешний сервис — детальный отчёт
# https://www.ssllabs.com/ssltest/
Сгенерировать самоподписанный сертификат (для тестов)
# Один файл — приватный ключ + сертификат
openssl req -x509 -newkey rsa:4096 \
-keyout key.pem -out cert.pem \
-days 365 -nodes \
-subj "/CN=localhost"
# Теперь можно поднять локальный HTTPS:
# nginx, caddy, или Python:
python3 -c "
import http.server, ssl
s = http.server.HTTPServer(('localhost', 8443), http.server.SimpleHTTPRequestHandler)
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('cert.pem', 'key.pem')
s.socket = ctx.wrap_socket(s.socket, server_side=True)
s.serve_forever()
"
curl с диагностикой TLS
# curl покажет цепочку и handshake
curl -v https://example.com 2>&1 | grep -E '(SSL|TLS|subject|issuer)'
# Игнорировать ошибки сертификата (только для дебага!)
curl -k https://self-signed.example.com
11. Чек-лист «понимаю это»
- ☐ Объясню, зачем нужен HTTPS, через 3 гарантии (конф/целостность/аутентификация)
- ☐ Различаю симметричное и асимметричное шифрование
- ☐ Понимаю, зачем оба нужны в TLS
- ☐ Знаю, что такое сертификат и что в нём лежит
- ☐ Объясню «цепочку доверия» Root → Intermediate → Leaf
- ☐ Помню три шага TLS handshake
- ☐ Знаю Let's Encrypt и понимаю, как ACME-валидация работает
- ☐ Знаю, что такое mTLS и где его применяют
- ☐ Использовал
openssl s_clientхотя бы раз
12. Задачи — реши сам (ответы спрятаны)
Задача 1. Ты сидишь в кафе на открытом Wi-Fi и заходишь в интернет-банк по HTTPS. Владелец Wi-Fi видит твой трафик. Что именно он может узнать, а что — нет?
Может узнать: куда ты ходишь — IP банка и, как правило, доменное имя (оно светится в DNS-запросе и в начале TLS-handshake — поле SNI). Не может: что именно ты делаешь — URL-пути, логин, пароль, суммы, содержимое страниц зашифрованы. Мораль: HTTPS защищает содержимое, но факт посещения — метаданные — виден. (Скрыть и его — тема VPN-курса.)
Задача 2. Браузер кричит красным: «Ваше подключение не защищено, NET::ERR_CERT_AUTHORITY_INVALID». Что произошло с точки зрения цепочки доверия? Стоит ли жать «Продолжить»?
Сертификат сайта не подписан доверенным CA: самоподписанный, либо цепочка оборвана (сервер забыл отдать intermediate), либо… между тобой и сайтом кто-то встал и подсовывает свой сертификат (MITM). Жать «Продолжить» на незнакомом сайте — нет: ты соглашаешься шифроваться с неизвестно кем. Исключение — свой тестовый сервер, где ты сам создал этот сертификат.
Задача 3. Почему TLS использует и асимметричное, и симметричное шифрование, а не что-то одно?
У каждого своя суперсила: асимметричное решает проблему «как договориться о секрете на виду у всех» (публичный/приватный ключ), но оно медленное. Симметричное — быстрое (гигабиты в секунду), но требует общего секрета заранее. Поэтому handshake асимметрией согласует общий ключ, а дальше весь трафик летит быстрым симметричным шифром. Лучшее из двух миров.
Задача 4. В понедельник в 03:00 у прода истёк TLS-сертификат. Какие симптомы увидят пользователи и мониторинг? Как этого больше никогда не допустить?
Пользователи — красную страницу «сертификат недействителен» во всех браузерах; API-клиенты — ошибки соединения; мониторинг — падение трафика при живом сервере. Профилактика: автопродление (certbot/cert-manager обновляют сертификат Let's Encrypt за 30 дней до конца) + алерт мониторинга «до истечения меньше N дней». Истёкший сертификат в 2026 — всегда ошибка процессов, не «неудача».
Задача 5. Чем mTLS отличается от обычного TLS и зачем он микросервисам, которые и так «внутри периметра»?
В обычном TLS сертификат показывает только сервер; клиент анонимен. В mTLS сертификаты предъявляют обе стороны — сервер убеждается, кто именно к нему пришёл. Микросервисам это нужно, потому что «внутри периметра» — опасная иллюзия: один взломанный под — и атакующий свободно ходит по внутренней сети. mTLS реализует принцип Zero Trust: не доверяй никому, проверяй каждого.
Задача 6. Let's Encrypt выдаёт сертификат бесплатно и автоматически. Как он убеждается, что домен действительно твой?
Через ACME-челлендж: просит доказать контроль над доменом — выложить
специальный файл на http://домен/.well-known/acme-challenge/… (HTTP-01) или создать
TXT-запись _acme-challenge в DNS (DNS-01). Сделать это может только владелец
сервера/домена. Проверка прошла — сертификат выпущен. Никакой магии — чистая инженерия.
Остался последний слепой участок. Ты знаешь, что едет по сети (HTTP в TLS-туннуле) и куда (IP+порт). Но как именно пакет находит дорогу через десятки сетей между твоим роутером и сервером? И как миллионы устройств с приватными адресами делят один публичный? Финальный урок собирает весь пазл: маршрутизация, шлюзы, NAT — и большой плейбук «нет интернета», в котором сойдётся всё, что ты выучил за восемь уроков.