Криптография с открытым ключом (также называемая асимметричной криптографией) — это основа SSL/TLS. Она использует пару математически связанных ключей — один открытый, один закрытый — для шифрования данных, проверки личности и установления безопасных соединений. Каждое HTTPS-соединение зависит от неё.
Концепция пары ключей
| Открытый ключ | Закрытый ключ | |
|---|---|---|
| Кто имеет | Все (он находится в сертификате) | Только владелец сервера |
| Может шифровать | ✅ | ✅ |
| Может расшифровать | Только то, что зашифровано закрытым ключом | Только то, что зашифровано открытым ключом |
| Можно делиться? | Да — в этом весь смысл | Никогда |
Суть: данные, зашифрованные открытым ключом, могут быть расшифрованы только соответствующим закрытым ключом. И наоборот. Два ключа математически связаны, но вывести закрытый ключ из открытого невозможно.
Как это используется в SSL/TLS
Криптография с открытым ключом выполняет три функции в каждом HTTPS-соединении:
1. Обмен ключами — установление общего секрета
Во время TLS-рукопожатия серверу и браузеру нужно согласовать общий сеансовый ключ для шифрования трафика. Они не могут отправить этот ключ в открытом виде — кто-то может его перехватить.
Решение: обмен ключами Диффи-Хеллмана (конкретно ECDHE в современном TLS). Обе стороны вносят случайные значения, и математика позволяет им вычислить один и тот же общий секрет, не передавая его. Закрытый ключ сервера подписывает его вклад, подтверждая личность сервера.
2. Аутентификация — подтверждение личности
SSL-сертификат сервера содержит его открытый ключ. Сертификат подписан удостоверяющим центром. Во время рукопожатия сервер доказывает, что владеет соответствующим закрытым ключом. Это доказывает, что сервер является тем, кем его называет сертификат.
Без этого шага кто угодно мог бы выдавать себя за google.com.
3. Цифровые подписи — подтверждение целостности данных
Закрытый ключ может создать цифровую подпись — математическое доказательство того, что конкретные данные были подписаны владельцем ключа и не были изменены. Сообщения TLS-рукопожатия подписываются для предотвращения вмешательства.
Симметричное vs асимметричное шифрование
| Асимметричное (открытый ключ) | Симметричное (сеансовый ключ) | |
|---|---|---|
| Ключи | Два (открытый + закрытый) | Один (общий секрет) |
| Скорость | Медленная (~в 1000 раз медленнее) | Быстрая |
| Используется для | Обмен ключами + аутентификация | Шифрование фактических данных |
| Алгоритмы | RSA, ECDSA, ECDHE | AES-GCM, ChaCha20 |
| В TLS | Только во время рукопожатия | После рукопожатия (весь трафик) |
HTTPS использует оба: асимметричное шифрование для рукопожатия (подтверждение личности, обмен ключами), затем симметричное шифрование для фактической передачи данных (потому что оно гораздо быстрее).
Алгоритмы, лежащие в основе SSL
RSA
Старейший алгоритм с открытым ключом, всё ещё используемый (1977). Основан на сложности факторизации больших простых чисел. Используется как для подписей, так и для обмена ключами, хотя обмен ключами RSA (без Диффи-Хеллмана) не обеспечивает прямую секретность и удалён из TLS 1.3.
ECDSA (Elliptic Curve Digital Signature Algorithm)
Современный алгоритм подписи, использующий математику эллиптических кривых. 256-битный ключ ECC обеспечивает безопасность, эквивалентную 3072-битному ключу RSA — ключи меньше, подписи быстрее. GetHTTPS по умолчанию использует ECDSA P-256.
ECDHE (Elliptic Curve Diffie-Hellman Ephemeral)
Механизм обмена ключами, используемый в современном TLS. «Ephemeral» (эфемерный) означает, что новая пара ключей генерируется для каждого соединения — обеспечивая прямую секретность. Используется как в TLS 1.2, так и в 1.3.
AES-GCM
Симметричный шифр, используемый после рукопожатия для шифрования фактического трафика. AES (Advanced Encryption Standard) с GCM (Galois/Counter Mode) обеспечивает и шифрование, и аутентификацию. Аппаратно ускоряется на современных процессорах через инструкции AES-NI.
Как GetHTTPS использует криптографию с открытым ключом
Когда вы используете GetHTTPS:
- Ваш браузер генерирует пару ключей с помощью Web Crypto API — тех же криптографических примитивов, которые использует сам TLS
- Открытый ключ помещается в CSR, отправляемый в Let’s Encrypt
- Закрытый ключ остаётся в памяти вашего браузера — никогда не передаётся
- Let’s Encrypt подписывает открытый ключ и возвращает ваш сертификат
- Вы скачиваете сертификат (открытый) и закрытый ключ на свой сервер
Тот факт, что закрытый ключ существует только в памяти браузера, делает GetHTTPS более конфиденциальным, чем инструменты, генерирующие ключи на удалённом сервере.
Часто задаваемые вопросы
Могут ли квантовые компьютеры взломать криптографию с открытым ключом?
Текущие квантовые компьютеры не могут. Но достаточно мощный квантовый компьютер, выполняющий алгоритм Шора, мог бы взломать RSA и ECC. Индустрия готовится с помощью постквантовой криптографии — новых алгоритмов (ML-KEM, ML-DSA), устойчивых к квантовым атакам. TLS перейдёт на них в гибридном режиме (классический + постквантовый) без изменения принципов работы сертификатов.
Почему бы не использовать асимметричное шифрование для всего?
Скорость. Асимметричные операции примерно в 1000 раз медленнее симметричных. Шифрование веб-страницы с помощью RSA было бы непрактично медленным. Вместо этого TLS использует асимметричную криптографию только для рукопожатия (~1 мс), а затем переключается на симметричную (AES) для данных — которая работает на аппаратной скорости.
Действительно ли 256-битный ключ ECC достаточно безопасен?
256-битный ECC обеспечивает ~128 бит безопасности — это означает, что атакующему потребуется примерно 2^128 операций, чтобы его взломать. Это больше операций, чем атомов в наблюдаемой Вселенной. Он безопасен на обозримое будущее (исключая квантовые компьютеры, для которых нужны совсем другие алгоритмы).
В чём разница между шифрованием и подписью?
Шифрование: защита конфиденциальности. Шифруете открытым ключом получателя → только его закрытый ключ может расшифровать. Подпись: подтверждение подлинности. Подписываете своим закрытым ключом → любой, имеющий ваш открытый ключ, может проверить, что это пришло от вас и не было изменено. TLS-сертификаты используют подписи; передача данных TLS использует шифрование.