TLS и HTTPS — защищённое соединение
Что на самом деле означает «замочек» в адресной строке, от чего он защищает и где его возможности заканчиваются.
- чем опасен обычный HTTP и какие три задачи решает TLS;
- как работают шифрование, сертификаты и рукопожатие TLS;
- что видно посторонним даже при HTTPS и что такое QUIC.
8.1Что не так с обычным HTTP
Обычный HTTP передаёт всё открытым текстом. Любой, кто находится на пути между вами и сервером — владелец Wi-Fi, провайдер, взломанный роутер, — может:
- прочитать всё, что вы отправляете и получаете, включая пароли и cookie;
- изменить содержимое на лету: вставить рекламу, подменить файл или реквизиты;
- выдать себя за сайт: ответить вместо настоящего сервера, и вы ничего не заметите.
HTTPS — это не отдельный протокол, а тот же HTTP, который передаётся внутри защищённого канала. Канал создаёт протокол TLS (Transport Layer Security). По умолчанию HTTPS использует порт 443.
8.2Три задачи TLS
| Свойство | Что гарантирует | От чего защищает |
|---|---|---|
| Конфиденциальность | Содержимое не прочитает никто, | От подслушивания кроме двух сторон |
| Целостность | Любое изменение данных в пути будет | От подмены и вставок замечено |
| Подлинность | Вы действительно соединились с тем | От поддельного сервера сайтом, чьё имя указано в адресе |
TLS пришёл на смену устаревшему протоколу SSL, и по привычке защиту до сих пор иногда называют «SSL» или «SSL-сертификат». Актуальные версии —TLS 1.3 (с 2018 года) и TLS 1.2; всё более старое признано небезопасным и отключено в современных браузерах.
8.3Два вида шифрования
TLS сочетает два подхода, потому что у каждого есть сильная и слабая сторона:
| Симметричное | Асимметричное | |
|---|---|---|
| Ключи | Один общий ключ у обеих сторон | Пара: открытый ключ известен всем, закрытый хранится в секрете |
| Скорость | Очень быстрое | Медленное |
| Трудность | Как безопасно передать ключ собеседнику? | Не подходит для больших объёмов данных |
| Роль в TLS | Шифрует сами данные | Помогает договориться об общем ключе и подтвердить личность сервера |
Самое удивительное в TLS —обмен ключами. Две стороны, которые никогда раньше не общались, договариваются об общем секретном ключе по открытому каналу, и посторонний, который слышит весь их разговор, вычислить этот ключ не может.
Вы с другом открыто договариваетесь об общем цвете — допустим, жёлтом. Каждый добавляет к нему свой секретный цвет и отправляет смесь другому. Получив чужую смесь, каждый добавляет в неё свой секрет ещё раз — и у обоих получается одинаковый итоговый цвет. Наблюдатель видел жёлтый и обе смеси, но разделить краску обратно на составляющие не может, а значит, итоговый цвет ему недоступен.
Для каждого соединения создаётся новый временный ключ. Поэтому даже если когда-нибудь будет украден закрытый ключ сервера, расшифровать записанные ранее разговоры не получится. Это свойство называется прямой секретностью (forward secrecy).
8.4Сертификаты: как убедиться, что сайт настоящий
Шифрование бесполезно, если вы зашифровали канал с мошенником. Поэтому сервер обязан доказать, что он тот, за кого себя выдаёт. Для этого он предъявляет сертификат — электронный документ, в котором указаны:
- доменное имя, для которого сертификат выдан;
- открытый ключ сервера;
- срок действия;
- цифровая подпись того, кто сертификат выдал.
Выдают сертификаты удостоверяющие центры (УЦ, по-английски CA). Перед выдачей центр проверяет, что заявитель действительно управляет доменом. Списки доверенных корневых центров встроены в операционные системы и браузеры.
Получив сертификат, браузер проверяет всю цепочку доверия: подписи должны сходиться вплоть до известного ему корневого центра, имя в сертификате — совпадать с именем в адресной строке, а срок — не истечь. Если что-то не так, появляется предупреждение на весь экран.
Вы доверяете паспорту не потому, что знаете его владельца, а потому, что доверяете государству, которое его выдало, и умеете отличить настоящий бланк от подделки. Удостоверяющий центр играет роль паспортного стола, а сертификат — роль паспорта сайта.
Не нажимайте «всё равно продолжить» — особенно в публичной сети и особенно если собираетесь вводить пароль или данные карты. Такое предупреждение означает, что браузер не смог подтвердить подлинность сайта, и между вами может находиться посторонний.
Сертификаты выдаются на ограниченный срок, и отрасль постепенно его сокращает: чем короче срок, тем меньше вреда от украденного ключа. Продлеваются они автоматически. Благодаря бесплатным удостоверяющим центрам вроде Let's Encrypt защищённое соединение стало нормой для подавляющего большинства сайтов.
8.5Рукопожатие TLS 1.3
Защищённый канал устанавливается сразу после рукопожатия TCP. В TLS 1.3 для этого достаточно одного обмена «туда-обратно»:
| Направление | Сообщение | Содержание |
|---|---|---|
| Браузер → Сервер | ClientHello | поддерживаемые шифры, имя сайта, моя часть ключа |
| Сервер → Браузер | ServerHello | выбранный шифр, моя часть ключа |
| Сервер → Браузер | Сертификат и подпись | уже зашифрованы общим ключом |
| Браузер → Сервер | Finished | проверка пройдена, отправляю первый запрос HTTP |
1.Браузер сразу отправляет свою часть для обмена ключами — не дожидаясь, пока сервер что-либо
выберет.
2.Сервер отвечает своей частью. С этого момента обе стороны знают общий ключ, и всё
дальнейшее идёт в зашифрованном виде.
3.Сервер предъявляет сертификат и подписывает ход переговоров своим закрытым ключом — это
доказывает, что сертификат действительно его.
4.Браузер проверяет сертификат и подпись и начинает передавать данные.
Для сравнения: в TLS 1.2 требовалось два обмена. А при повторном подключении к знакомому сайту TLS 1.3 позволяет отправить первый запрос вообще без ожидания — это режим 0-RTT.
8.6Что HTTPS скрывает, а что нет
«Замочек» защищает содержимое разговора, но не сам факт разговора. Полезно точно понимать границу:
| Посторонний на пути НЕ видит | Посторонний на пути видит |
|---|---|
| Полный адрес страницы: путь и параметры | IP-адрес сервера, к которому вы подключились |
| Заголовки запросов и ответов, cookie | Имя сайта — оно передаётся в открытой части рукопожатия (поле SNI) и в обычных DNS-запросах |
| Логины, пароли, данные форм | Время, длительность соединения и объём переданных данных |
| Содержимое страниц, файлов, переписки | Сам факт использования HTTPS |
Иными словами, провайдер знает, что вы заходили на сайт банка, но не знает, что именно вы там делали. Оставшиеся «утечки» имени постепенно закрывают шифрованный DNS (модуль 6) и технология ECH, которая шифрует имя сайта в рукопожатии.
HTTPS гарантирует, что вы соединились именно с тем доменом, который указан в адресной строке, и что вас никто не подслушивает. Он ничего не говорит о честности владельца. Мошеннический сайт с опечаткой в адресе тоже легко получает сертификат и замочек. Всегда проверяйте само имя сайта.
Ещё одна полезная защита —HSTS. Сайт сообщает браузеру: «ко мне — только по HTTPS». После этого браузер сам заменяет http на https и не позволяет обойти предупреждение о сертификате.
8.7QUIC: новый транспорт для HTTP/3
К этому моменту у нас накопились три претензии к связке TCP + TLS: два рукопожатия подряд, блокировка начала очереди и разрыв соединения при смене сети. Протокол QUIC решает все три. Он работает поверх UDP, а всё, что раньше делал TCP, — надёжность, порядок, управление перегрузкой — реализует сам, но по-новому.
| Возможность | Что это даёт |
|---|---|
| Одно рукопожатие вместо двух | Установление соединения и согласование шифрования TLS 1.3 объединены в один обмен. Сайт начинает открываться быстрее. |
| Независимые потоки | Каждый запрос идёт в собственном потоке. Потерянный пакет задерживает только свой поток, остальные продолжают работать. |
| Перенос соединения | Соединение привязано не к IP-адресу, а к собственному идентификатору. Вы выходите из дома, телефон переключается с Wi-Fi на мобильную сеть — загрузка не обрывается. |
Шифрование по умолчанию Незашифрованного QUIC не существует. Зашифрована даже большая часть
служебной информации.
Почему QUIC построили на UDP, а не сделали новым протоколом рядом с TCP? Потому что роутеры и сетевые экраны по всему миру умеют пропускать только TCP и UDP, и новый протокол просто не прошёл бы через большинство сетей. UDP стал «упаковкой», которую пропускают везде.
- HTTPS — это HTTP внутри канала TLS: содержимое зашифровано, защищено от подмены, а подлинность сайта подтверждена сертификатом. Имя и адрес сайта при этом остаются видны, а за честность владельца сайта протокол не отвечает.