Урок 7 — HTTPS и TLS

Замочек 🔒 в адресной строке. Что он значит? Как браузер «знает», что сайт настоящий, и почему никто не может подглядеть твой пароль на пути от Лондона до Франкфурта? Это работа TLS.

В этом уроке
  1. Зачем нужен HTTPS
  2. Три гарантии TLS
  3. Минимум криптографии: симметричное и асимметричное
  4. Что такое сертификат
  5. Кто такие CA и почему им доверяют
  6. TLS handshake шаг за шагом
  7. Let's Encrypt и автоматизация
  8. mTLS — взаимная аутентификация
  9. Что с этим делает DevOps
  10. Команды и упражнения
  11. Чек-лист
  12. Задачи с ответами
Вспомни из прошлых уроков

HTTP — текстовый разговор клиента и сервера поверх TCP-соединения (уроки 4 и 6), и весь этот разговор по умолчанию виден каждому узлу на пути пакета — а узлов, как ты видел в traceroute, добрый десяток. Сегодняшний урок — про то, как поверх той же трубы построили «бронированный туннель», не поменяв ни HTTP, ни TCP. Приготовься: будет немного криптографии, но ровно столько, сколько нужно инженеру.

1. Зачем нужен HTTPS

В уроке 6 мы видели, как HTTP-запрос — это обычный текст. Кто-то с доступом к каналу (Wi-Fi в кафе, провайдер, государство) видит всё: твои пароли, переписку, банковские данные. Это не приемлемо.

HTTPS = HTTP + TLS. TLS — это «прозрачная труба шифрования». HTTP-запрос идёт сначала в TLS, тот шифрует и передаёт. На той стороне TLS расшифровывает и отдаёт HTTP-серверу. Само HTTP-приложение даже не знает, что выше есть шифрование.

HTTPS = HTTP внутри TLS HTTP (без шифрования) GET /login user=alice&pass=12345 👁️ Видно всем по пути HTTPS (с TLS) █████████████████████ ██████████████████ 🔒 Видно только отправителю и получателю Содержимое одинаковое — но в HTTPS оно превращается в бессмысленный шифр для всех «посередине».

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. Что такое сертификат

Сертификат — это файл, который содержит:

Внутри X.509 сертификата 🪪 Certificate Subject: CN = example.com SAN = example.com, www.example.com, api.example.com Issuer: Let's Encrypt R3 Valid: 2026-04-01 → 2026-06-30 Public Key: RSA 2048-bit / ECDSA P-256 0x04AB 9F23 71D5 ... Signature: подпись Let's Encrypt 0x8FC1 33D2 7B49 ...
Сертификат — это «удостоверение» с публичным ключом сервера, подписанное доверенным CA.

Когда клиент получает этот файл, он:

  1. Проверяет имя — совпадает ли с тем, к кому он идёт
  2. Проверяет срок — не истёк ли
  3. Проверяет подпись — настоящий ли это сертификат

Если хоть один шаг провалился — браузер показывает страшное предупреждение.

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 — в системе. Их там пара сотен.

Цепочка доверия (Chain of Trust) 🏛️ Root CA ISRG Root X1 (вшит в браузер) подписывает 📜 Intermediate CA Let's Encrypt R3 подписывает 🌐 example.com Браузер доверяет Root, потому что он у него в trust-store. Доверяет Intermediate, потому что Root его подписал. Доверяет example.com, потому что Intermediate его подписал.
Цепочка доверия: браузер проверяет, что сертификат сайта подписан Intermediate, а тот — Root, который он знает.

Промежуточные CA нужны для безопасности — если их ключ скомпрометируется, отозвать можно отдельно, не трогая корневой. Корневые ключи хранят оффлайн в специальных HSM-устройствах.

6. TLS handshake шаг за шагом

Когда браузер открывает HTTPS-сайт, перед обменом HTTP-данными происходит «знакомство» — TLS handshake. В TLS 1.3 это 1 RTT (round-trip):

💻 Клиент 🖥️ Сервер 1. Client Hello «Какие шифры я поддерживаю, мой случайный random, какой домен (SNI), мой временный публичный ключ» 2. Server Hello + Certificate + Key share «Выбираю этот шифр, вот мой сертификат, мой временный публичный ключ» Клиент проверяет: • сертификат настоящий • имя совпадает • не отозван Обе стороны независимо вычисляют общий симметричный ключ через ECDHE (никто посередине его не получит) 3. Finished (encrypted) Дальше — всё симметрично шифруется этим ключом 🔒 Соединение защищено. Теперь HTTP-данные шифруются.
TLS 1.3 handshake — за 1 RTT клиент и сервер договариваются о симметричном ключе, который никто посередине не узнает.

Ключевая магия — обмен ключами Диффи-Хеллмана (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 дней. Перед истечением — продлеваешь автоматически.

Способы подтверждения владения:

В DevOps-практике:

8. mTLS — взаимная аутентификация

Обычный TLS аутентифицирует только сервер. Клиент анонимен (или аутентифицируется через Authorization-заголовок поверх TLS).

В mTLS (mutual TLS) обе стороны предъявляют сертификаты. Сервер тоже проверяет клиента. Это идеально для:

Это твой хлеб как DevSecOps. Запомни и приходи позже.

9. Что с этим делает DevOps

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. Чек-лист «понимаю это»

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). Сделать это может только владелец сервера/домена. Проверка прошла — сертификат выпущен. Никакой магии — чистая инженерия.

HTTPS = HTTP + TLS. TLS даёт три гарантии: конфиденциальность, целостность, аутентификация. Сертификат подписан цепочкой CA, корни которой вшиты в браузеры. Handshake обменивается ключами (асимметрия) для согласования общего симметричного ключа. Let's Encrypt + cert-manager / certbot — стандарт сегодня. mTLS = взаимная аутентификация для микросервисов / Zero Trust.
Мост к последнему уроку

Остался последний слепой участок. Ты знаешь, что едет по сети (HTTP в TLS-туннуле) и куда (IP+порт). Но как именно пакет находит дорогу через десятки сетей между твоим роутером и сервером? И как миллионы устройств с приватными адресами делят один публичный? Финальный урок собирает весь пазл: маршрутизация, шлюзы, NAT — и большой плейбук «нет интернета», в котором сойдётся всё, что ты выучил за восемь уроков.

← Назад
Урок 6: HTTP