Люди описывают VPN как «тот, что использует шифрование открытым ключом», а затем представляют, будто каждый пакет заперт сертификатом сервера. Это представление неверно в том смысле, который важен при чтении файла конфигурации или записи пакетов. Открытоключевая половина VPN нужна, чтобы доказать, кто партнёр, и договориться о секретном материале; симметричная половина — та, что действительно защищает трафик, пакет за пакетом, всю жизнь сессии.

У двух половин разные сроки жизни, разные режимы отказа и разные вещи, которые можно безопасно публиковать. Как только вы их разделите, вопросы вроде «RSA 2048 слабее AES-128» перестают путать, потому что они никогда не были сравнимы.

Три операции, которые смешивают

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

Рукопожатия VPN используют в основном первые две. Сертификат — не ключ шифрования; это подписанное утверждение, связывающее имя с открытым ключом и позволяющее другой стороне решить, доверять ли только что полученному ключу. Например, установление ключей в TLS 1.3 опирается на согласование ключей (EC)DHE и подписи сертификатов, а не на шифрование сессии открытым ключом сервера.

Что на самом деле производит рукопожатие

В современном рукопожатии каждая сторона создаёт эфемерную пару ключей, обменивается открытыми половинами и вычисляет общий секрет, который никогда не идёт по проводу. Затем этот секрет проходит через функцию вывода ключей, порождая отдельные ключи для каждого направления, а также nonce и материал IV, нужный слою записей. WireGuard делает это своей конструкцией на основе Noise; TLS 1.3 — через HKDF по транскрипту рукопожатия.

Долговременный учётный материал — сертификат и закрытый ключ или статический ключ WireGuard — аутентифицирует этот обмен. Он подписывает транскрипт или вмешивается в него, чтобы посторонний не мог завершить рукопожатие вместо партнёра. После этого учётный материал не выполняет работу на каждый пакет. Если бы выполнял, каждому пакету требовалась бы операция с закрытым ключом, и загруженный туннель ограничивался бы самой медленной операцией в стеке.

Отсюда два побочных эффекта. Во-первых, сессионные ключи каждый раз новые, поэтому злоумышленник, который позже украдёт долговременный ключ, не сможет расшифровать записанные ранее сессии, если согласование было эфемерным. Во-вторых, утёкший сессионный ключ компрометирует одну сессию, а не личность.

Почему большие объёмы данных используют симметричные ключи

Симметричные шифры хорошо справляются с объёмом: AES-GCM или ChaCha20-Poly1305 обрабатывают каждый пакет уже находящимся в памяти ключом, аутентифицируют заголовок и увеличивают счётчик. Принимающая сторона проверяет nonce и тег аутентификации и отбрасывает всё, что не прошло или повторилось. Это достаточно дёшево, чтобы работать на скорости линии на обычном железе, и та же конструкция даёт конфиденциальность и целостность за один проход.

Эта конструкция — ещё и место, где живёт большинство ошибок реализации. Повтор nonce в GCM ломает конфиденциальность и подлинность сразу, поэтому протоколы выводят ключи на направление и держат явный счётчик или эпоху. Если вы читаете запись пакетов и длина шифртекста совпадает с открытым текстом плюс фиксированная нагрузка, работает симметричный слой, а не операция с открытым ключом на каждый пакет.

Время жизни, обновление ключей и прямая секретность

Сессионные ключи рассчитаны на истечение. TLS 1.3 разрешает сообщению KeyUpdate проворачивать ключи трафика; WireGuard обновляет сессию по заданному времени или числу сообщений и недолго хранит старый ключ для пакетов в пути. OpenVPN пересогласовывает ключи своего канала данных по расписанию, а reneg-sec управляет интервалом.

Ни одна из этих ротаций не равна обновлению сертификата. Сертификат может быть действителен год, пока сессионные ключи меняются каждые несколько минут, и сертификат можно заменить, не трогая ключи работающего туннеля. Планируя истечение, спросите, какой объект вы ротируете; ответ решает, будут ли клиенты переподключаться или только обновят ключи.

Чтение конфигураций и диагностики без смешивания объектов

На практике вы выбираете полный протокол и поддерживаемые им примитивы, а не собираете свой. Ключ --tls-crypt OpenVPN защищает канал управления; канал данных использует согласованные симметричные шифры. Записи PrivateKey и PublicKey WireGuard — материал идентичности, а его транспортные ключи выводятся внутри. Чтение этих полей как одного и того же вида секрета ведёт к ошибкам вроде вставки открытого ключа туда, где должен быть закрытый.

Держите открытый материал отдельно от закрытого. Сертификат, открытый ключ WireGuard и отпечаток безопасно передавать в тикете. Закрытый ключ, предварительно разделённый ключ и экспортированный сессионный ключ — нет. Сравнивая стойкость, сравнивайте внутри одного типа: идентификатор эллиптической кривой, размер модуля RSA и размер ключа AES измеряют разные вещи при разных допущениях. Спецификация TLS 1.3 — полезный справочник о том, как два слоя стыкуются, даже если ваш туннель не TLS.

Похожие статьи