Что такое HTTPS? #
HTTPS (HyperText Transfer Protocol Secure) — это защищённая версия HTTP, которая использует шифрование для безопасной передачи данных между клиентом (браузером) и сервером.
Технически HTTPS = HTTP + TLS
Протокол шифрования называется TLS (Transport Layer Security) — современная версия SSL.
В истории защищённых веб-соединений всё началось не с TLS, а с SSL. Именно так назывался протокол, разработанный в 1994 году Netscape для шифрования HTTP-трафика. Он прошёл через три версии: 1.0, 2.0 и 3.0
Позже в 1999 году развитие SSL перешло под управление IETF. Существенных изменений в архитектуре не произошло, однако у SSL обнаружились серьёзные уязвимости, из-за которых протоколу дали новое имя — TLS. Старое название к тому времени уже прочно вошло в обиход, поэтому и сегодня SSL и TLS часто используют как взаимозаменяемые термины (например, в nginx включение TLS выполняется через параметр ssl).
В этой статье я буду использовать корректное и актуальное название — TLS.
На момент написания материала существует четыре версии TLS: 1.0, 1.1, 1.2 и 1.3. В дальнейшем мы сосредоточимся на разборе версии TLS 1.2
Основные задачи HTTPS
HTTPS обеспечивает три ключевых свойства безопасности:
- Конфиденциальность - данные передаются в зашифрованном виде и недоступны при перехвате трафика. Даже если злоумышленник перехватит пакеты в публичной Wi-Fi сети, он увидит лишь набор зашифрованных байтов, а не логины, пароли или номера карт.
- Целостность - любые изменения данных в пути будут обнаружены. В TLS 1.2 целостность обеспечивается с помощью HMAC (в режимах CBC) или встроенных механизмов AEAD (например, GCM). Если хотя бы один байт будет изменён, проверка не пройдёт, и соединение будет разорвано.
- Аутентификация - подтверждается подлинность сервера. Цифровой сертификат доказывает, что вы подключились именно к нужному домену. Браузер проверяет подпись центра сертификации (CA), срок действия сертификата и соответствие доменного имени.
Таким образом, HTTPS защищает данные во время передачи по сети, создавая безопасный канал между клиентом и сервером.
HTTPS защищает от атак типа MITM (Man-in-the-Middle), когда злоумышленник может перехватить и подменить передаваемую информацию.
Однако важно понимать: HTTPS защищает данные в процессе передачи, но не защищает сервер от взлома и не гарантирует безопасность самого приложения.
Что происходит при открытии сайта по HTTPS #
Когда пользователь заходит на сайт https://asterisker.com, происходит несколько последовательных этапов.
TLS 1.2 Handshake Process
Шаг 1. Установка TCP-соединения
Браузер сначала устанавливает обычное TCP-соединение с сервером:
- выполняется TCP 3-way handshake
- используется порт 443
- создаётся транспортный канал для дальнейшего TLS-обмен
После этого начинается криптографическая часть.
Шаг 2. TLS Handshake (рукопожатие)
Это ключевой этап, во время которого стороны:
- договариваются о версии протокола
- выбирают алгоритмы шифрования
- проверяют подлинность сервера
- создают общий секретный ключ
Во время TLS-handshake:
- ClientHello (клиент → сервер)
Браузер отправляет:- поддерживаемые версии TLS
- список поддерживаемых cipher suites
- случайное число (Client Random)
- дополнительные расширения (SNI, ALPN и др.)
- ServerHello (сервер → клиент)
Сервер отвечает:- выбранной версией TLS
- выбранным набором шифров
- своим цифровым сертификатом
- случайным числом (Server Random)
- Проверка сертификата
Браузер проверяет:- подпись центра сертификации (CA)
- срок действия сертификата
- соответствие доменного имени
- цепочку доверия
Если проверка не проходит — соединение прерывается.
- Теперь стороны должны договориться об общем секрете.
Формирование общего секрета (Pre-Master Secret)
Возможные механизмы:- RSA — в устаревших схемах (без PFS). Клиент генерирует Pre-Master Secret и шифрует его публичным ключом сервера.
- ECDHE — в современных версиях (обеспечивает PFS). Клиент и сервер генерируют временные (ephemeral) ключи и вычисляют общий секрет с помощью алгоритма Диффи-Хеллмана на эллиптических кривых.
В TLS 1.2 обмен общим секретом может выполняться через RSA или ECDHE. В TLS 1.3 используется только ECDHE.
PFS (Perfect Forward Secrecy) - даже если в будущем приватный ключ сервера будет скомпрометирован, ранее перехваченный трафик невозможно расшифровать, потому что каждая сессия использует уникальные временные ключи, которые не сохраняются.
В TLS 1.2 после согласования Pre-Master Secret стороны применяют псевдослучайную функцию PRF (Pseudo-Random Function) на основе HMAC, чтобы последовательно вычислить Master Secret и затем рабочие ключи сессии.
Важно: различаем секреты и ключи
Не путаем:
- Pre-Master Secret — общий секрет, полученный в результате механизма обмена ключами (RSA или ECDHE)
- Master Secret — вычисляется из Pre-Master Secret
- Session Keys — реальные рабочие ключи для шифрования и проверки целостности
1. RSA / ECDHE → Pre-Master Secret
2. Pre-Master Secret + Client Random + Server Random
↓ PRF
Master Secret
3. Master Secret
↓ PRF
Session Keys
Как вычисляются Master Secret
Из следующих значений:
- Client Random
- Server Random
- Pre-Master Secret
с помощью PRF вычисляется Master Secret
⚠️ Ни Pre-Master Secret, ни Master Secret не используются напрямую для шифрования данных.
Из Master Secret с помощью PRF выводятся рабочие ключи сессии (session keys):
- ключ шифрования клиента (client_write_key)
- ключ шифрования сервера (server_write_key)
- MAC-ключи (client/server MAC keys, в режимах CBC)
- дополнительные параметры (IV)
Именно эти session keys используются для:
- шифрования данных
- проверки целостности
- защиты всего HTTP-трафика
После завершения TLS handshake начинается передача зашифрованных HTTP-сообщений.
В TLS 1.3 процесс упрощён:
- RSA больше не используется для обмена ключами
- всегда применяется ECDHE
- PFS является обязательным
- количество сообщений в handshake сокращено
- используется современная схема вывода ключей (HKDF на основе HMAC)
Почему в HTTPS используется симметричное шифрование #
TLS использует гибридную модель шифрования, потому что разные алгоритмы решают разные задачи.
Асимметричное шифрование (RSA, ECDSA)
Особенности:
- Использует пару ключей: публичный и приватный
- Позволяет безопасно обменяться секретом через открытую сеть
- Математически сложное и вычислительно затратное
Недостаток:
- Значительно медленнее симметричного шифрования
- Неподходит для шифрования больших объёмов данных
Используется для:
- аутентификации сервера
- безопасного обмена ключами сессии
Симметричное шифрование (AES)
Особенности:
- Один общий секретный ключ
- Очень высокая скорость работы
- Минимальная нагрузка на процессор
Используется для:
- шифрования всего HTTP-трафика после установки соединения
Почему нельзя использовать только асимметричное шифрование #
Если бы каждый пакет шифровался RSA:
- серверу пришлось бы выполнять дорогие математические операции
- производительность резко упала бы
- нагрузка на CPU выросла бы кратно
Поэтому используется схема:
- Асимметричное шифрование → безопасно договориться о ключе
- Симметричное шифрование → быстро передавать данные
Какая разница между механизмами получения общего секрета - RSA и ECDHE #
Если используется RSA (старый вариант TLS 1.2)
- Клиент генерирует Pre-Master Secret
- Шифрует его публичным ключом сервера (из сертификата)
- Отправляет серверу
- Сервер расшифровывает своим приватным ключом
В этом случае общий секрет фактически создаёт клиент, а сервер его просто расшифровывает.
В RSA отсутствует PFS, если приватный ключ сервера украдут — можно расшифровать старый трафик.
Если используется ECDHE (современный вариант)
- Клиент и сервер обмениваются временными публичными ключами
- Каждый вычисляет общий секрет независимо
- Секрет никогда не передаётся по сети
В этом случае используется алгоритм Диффи–Хеллмана (ECDHE) на эллиптических кривых.
В ECDHE есть PFS, даже если ключ сервера украдут — старые сессии останутся защищёнными.
Что такое Cipher Suite #
Cipher suite — это набор алгоритмов, которые TLS использует для безопасного соединения. В него обычно входят три компонента:
- Алгоритм шифрования (encryption algorithm) — шифрует данные, чтобы их нельзя было прочитать третьим лицам.
- Алгоритм аутентификации/подписи (authentication/MAC algorithm) — проверяет целостность и подлинность данных.
- Алгоритм обмена ключами (key exchange algorithm) — отвечает за безопасную генерацию и обмен ключами между клиентом и сервером.
Примеры:
TLS_RSA_WITH_AES_128_CBC_SHA:
- TLS — протокол, версия 1.0–1.2
- RSA — алгоритм обмена ключами и аутентификации сервера
- AES_128_CBC — симметричный алгоритм шифрования данных
- SHA — хэш-функция для проверки целостности данных через HMAC-SHA1
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- TLS — протокол версии 1.0–1.2 (чаще используется в TLS 1.2)
- ECDHE — Elliptic Curve Diffie-Hellman Ephemeral, алгоритм обмена ключами с поддержкой PFS
- ECDSA — алгоритм аутентификации сервера на основе эллиптических кривых
- AES_128_GCM — симметричный алгоритм AES с ключом 128 бит в режиме GCM (шифрование + встроенная проверка целостности)
- SHA256 — хэш-функция для PRF и создания ключевого материала (в GCM отдельный HMAC не используется)
У современного Cipher Suite из TLS 1.3 структура немного другая:
TLS_AES_128_GCM_SHA256:
- TLS — протокол, версия 1.3
- AES_128 — симметричный алгоритм шифрования AES с ключом 128 бит
- GCM — режим шифрования Galois/Counter Mode, который одновременно шифрует и проверяет целостность данных (интегрирует функции MAC)
- SHA256 — хэш-функция, используемая для создания ключей (не для отдельной проверки целостности, как в старых версиях TLS)
Ключевые отличия Cipher Suite
| Особенность | TLS_RSA_WITH_AES_128_CBC_SHA | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | TLS_AES_128_GCM_SHA256 |
|---|---|---|---|
| Версия протокола | TLS 1.0–1.2 | TLS 1.2 | TLS 1.3 |
| Алгоритм обмена ключами | RSA (нет PFS) | ECDHE (есть PFS) | Всегда (EC)DHE |
| Аутентификация сервера | RSA | ECDSA | Отдельно от cipher |
| Шифрование данных | AES-128 в CBC | AES-128 в GCM (AEAD) | AES-128 в GCM (AEAD) |
| Проверка целостности | HMAC-SHA1 | встроена в GCM | встроена в GCM |
| PFS | ❌ Нет | ✅ Да | ✅ Да |
| Уязвимости | padding oracle, SHA-1 слабый | существенно безопаснее | современный стандарт |
Особенность TLS 1.3: в нём нет явного алгоритма обмена ключами в названии Cipher Suite — обмен ключами теперь всегда ведётся через ECDHE (Ephemeral Diffie-Hellman), что делает соединение более безопасным.
Протокол обмена ключами Диффи-Хеллмана (DH) #
В 1976 году Уитфилд Диффи и Мартин Хеллман представили алгоритм, позволяющий двум незнакомым сторонам безопасно обмениваться ключами через публичные каналы связи. Эта разработка заложила основу для асимметричного шифрования, также известного как криптография с открытым ключом.
Данный криптографический протокол дает возможность двум или более участникам выработать общий секретный ключ, даже если канал связи не защищен от прослушивания. В дальнейшем этот ключ применяется для шифрования последующих сообщений с использованием методов симметричного шифрования.
Как работает алгоритм Диффи-Хеллмана?
На схеме показан классический механизм обмена ключами по алгоритму Diffie–Hellman.
Его цель — безопасно получить общий секретный ключ, даже если весь обмен проходит по открытому каналу.
Шаг 1. Публичные параметры
Стороны заранее договариваются (в открытом виде) о двух числах:
- P = 13 — простое число (prime number)
- G = 6 — генератор
Шаг 2. Приватные числа
Каждая сторона выбирает свой секрет:
- Алиса выбирает private = 5
- Боб выбирает private = 4
Эти числа никому не передаются.
Шаг 3. Вычисление публичных ключей
Каждая сторона вычисляет свой публичный ключ по формуле:
Public = (G ^ Private) mod P
Можно использовать калькулятор в инженерном режиме.
- Алиса: (6^5) mod 13 = 2
- Боб: (6^4) mod 13 = 9
Затем они обмениваются этими числами (2 и 9) по открытому каналу.
Шаг 4. Вычисление общего секрета
Теперь каждая сторона использует:
- полученный публичный ключ соседа
- свой приватный ключ
Формула:
Shared Secret = (Public_other ^ Private_self) mod P
- Алиса: (9^5) mod 13 = 3
- Боб: (2^4) mod 13 = 3
В результате обе стороны получают одинаковый секрет = 3.
Почему это безопасно?
Злоумышленник видит:
- P = 13
- G = 6
- 2 и 9 (публичные ключи)
Но чтобы вычислить общий секрет, ему нужно узнать приватные числа (5 или 4). Это требует решения задачи дискретного логарифма — вычислительно сложной задачи при больших числах.
Зачем это нужно?
Diffie–Hellman:
- используется в TLS/HTTPS
- позволяет безопасно договориться о симметричном ключе
- после этого применяется быстрое симметричное шифрование (например, AES)
📌 Важно: сам Diffie–Hellman не шифрует данные, он только позволяет безопасно создать общий секретный ключ.
Основы криптографии #
Симметричное шифрование #
В верхней части схемы изображён механизм, при котором:
- Используется один и тот же секретный ключ
- Этот ключ применяется и для шифрования, и для расшифрования
- Отправитель и получатель должны заранее безопасно обменяться этим ключом
📌 Особенность: алгоритмы работают быстро и подходят для шифрования больших объёмов данных (например, VPN, TLS-сессии после установки соединения).
⚠️ Проблема: если ключ будет перехвачен, злоумышленник сможет и зашифровать, и расшифровать данные.
AES (Advanced Encryption Standard): AES - это широко используемый симметричный алгоритм шифрования. Он поддерживает ключи размером 128, 192 или 256 бит. AES известен своей скоростью и безопасностью и широко используется в различных приложениях.
DES (Data Encryption Standard): DES - это старый симметричный алгоритм шифрования, использующий ключ размером 56 бит. Хотя DES был широко использован в прошлом, сейчас он считается небезопасным из-за малого размера ключа.
3DES (Triple DES): 3DES применяет алгоритм DES три раза с разными ключами, что приводит к более сильному методу шифрования. Однако 3DES медленнее AES и в настоящее время в большинстве случаев заменяется на AES.
Blowfish: Blowfish - это симметричный блочный шифр, поддерживающий переменную длину ключа (до 448 бит). Он известен своей простотой и скоростью, что делает его подходящим для многих приложений.
Асимметричное шифрование #
В нижней части схемы показана модель с двумя разными ключами:
- Открытый ключ (Public Key) — можно передавать кому угодно
- Закрытый ключ (Private Key) — хранится в секрете владельцем
Ключи математически связаны между собой.
1. Шифрование для передачи данных
- Сообщение шифруется открытым ключом получателя
- Расшифровать его может только владелец закрытого ключа
Это позволяет безопасно передавать данные без предварительного обмена секретами.
2. Подпись
- Данные подписываются закрытым ключом
- Проверить подпись может любой, у кого есть открытый ключ
Это используется для:
- TLS-сертификатов
- Электронной подписи
- Проверки подлинности ПО
RSA (Rivest-Shamir-Adleman): RSA - это широко используемый асимметричный алгоритм шифрования для безопасной передачи данных и создания цифровых подписей. Он опирается на математическую сложность факторизации больших простых чисел.
DSA (Digital Signature Algorithm): DSA - это алгоритм цифровой подписи, используемый для создания и проверки цифровых подписей. Он часто используется в сочетании с симметричным шифрованием для обеспечения безопасной связи.
DH (Diffie-Hellman): DH - это алгоритм обмена ключами, используемый для безопасного обмена криптографическими ключами через открытый канал. Он позволяет двум сторонам установить общий секретный ключ без его прямой передачи.
Хэш-функции #
SHA (Secure Hash Algorithm): SHA - это семейство криптографических хэш-функций, включая SHA-1, SHA-256, SHA-384 и SHA-512. Эти хэш-функции генерируют фиксированный хэш-значение из входных данных, часто используемых для проверки целостности данных и хэширования паролей.
Главное отличие #
| Симметричное | Асимметричное |
|---|---|
| Один ключ | Два разных ключа |
| Быстрое | Медленнее |
| Проблема передачи ключа | Безопасная передача через public key |
| Подходит для шифрования трафика | Подходит для обмена ключами и подписи |
TLS (Transport Layer Security): TLS - это протокол, который комбинирует симметричное и асимметричное шифрование для безопасной связи через сеть. Он использует асимметричное шифрование для обмена ключами (например, RSA) и симметричное шифрование (например, AES) для передачи данных.