Слепо подписанные ваучеры и анонимные учётные данные доступа

AeroNyx6 мин чтения

Как VPN-ваучеры AeroNyx позволяют узлу проверить оплату, не узнавая оплатившего аккаунта, что всё ещё допускает режим развёртывания reject_invalid, что по-прежнему могут видеть узел и бэкенд и почему допуск в Blind Vault реализован, но не развёрнут.

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

Два пути учётных данных

Путь учётных данныхСостояниеМодель погашения
Ваучер VPN-рукопожатияРаботает. Действует в режиме совместимости reject_invalidУзел проверяет подпись. Он не отслеживает однократное использование
Допуск в Blind Vault V2Реализован в узле. Не развёрнут и не используется официальным приложениемОднократное использование, фиксируемое атомарно вместе с созданием аренды
Допуск в Blind Vault V1Только для совместимости, в том же отключённом компонентеОднократное использование, но выдачу можно связать с погашением

Как выдаётся VPN-ваучер

  1. Приложение генерирует случайный 32-байтовый токен и локально ослепляет его с помощью слепых подписей RSA (RSABSSA-SHA384-PSS-Randomized, RFC 9474).
  2. Приложение отправляет на бэкенд AeroNyx по адресу /api/voucher/issue/ только ослеплённое сообщение. Бэкенд проверяет, что у вошедшего аккаунта есть право доступа, подписывает ослеплённое сообщение и возвращает подпись. Он никогда не видит токен.
  3. Приложение локально финализирует подпись. Готовый ваучер (токен, подпись, рандомизатор сообщения и эпоха ключа) — это учётные данные на предъявителя, не связанные с запросом на выдачу.

Открытые ключи эмитента, сгруппированные по эпохам, публикуются по адресу:

text
GET https://api.aeronyx.network/api/voucher/issuer/keys/

Как узел проверяет ваучер

Приложение добавляет к VPN ClientHello расширение с ваучером:

text
ClientHello fixed frame
  + magic: AVCH
  + voucher_length: u16 little-endian
  + voucher JSON (maximum 2048 bytes)
json
{
  "token": "base64-32-byte-token",
  "signature": "base64-finalized-blind-signature",
  "msg_randomizer": "base64-32-byte-randomizer",
  "epoch": "issuer-key-epoch"
}

Узел разбирает только эти поля. Он получает открытые ключи эмитента для эпохи с указанного выше эндпоинта, кеширует их на один час и проверяет рандомизированную подпись RSA-PSS на основе SHA-384. Ему не нужен идентификатор кошелька или аккаунта.

Режим развёртывания: reject_invalid

  • Некорректно сформированные и криптографически недействительные ваучеры отклоняются до принятия рукопожатия.
  • Подключение совсем без ваучера по-прежнему принимается, чтобы старые клиенты продолжали работать. Использование ваучеров пока не обязательно.
  • Узел не записывает использованные ваучеры. Узлы принимают действительный ваучер столько раз, сколько он предъявляется, пока эпоха его ключа эмитента остаётся опубликованной. Ограничения на передачу, повторное использование и квоты обеспечивает бэкенд, а не узел.

Узлы сообщают только агрегированные результаты:

text
mode = reject_invalid
valid | invalid | missing | malformed | total
valid_ratio | invalid_ratio | missing_ratio | malformed_ratio
last_observation | last_error

Что узел узнаёт о вас

Гарантия «узел никогда не узнаёт идентичность вашего кошелька» действует только для подключений с ваучером.

  • Подключения с ваучером (официальное приложение): приложение подключается с ваучером и новым временным ключом рукопожатия. Узел может проверить оплату, но не может связать сессию с вашим кошельком или P2P-идентичностью.
  • Устаревшие подключения: клиент, который аутентифицируется ключом своей идентичности вместо ваучера, отправляет этот ключ в рукопожатии.

В обоих случаях узел сообщает бэкенду AeroNyx открытый ключ рукопожатия сессии в поле с именем client_wallet вместе со временем сессии и объёмом в байтах. Для подключения с ваучером это значение — временный ключ. Для устаревшего подключения — ключ идентичности клиента. Операторы узлов могут видеть трафик по каждой сессии и эти ключи в Nodeboard.

Ваучеры также не скрывают всё остальное. Узел по-прежнему видит ваш IP-адрес, а как выходной узел — ваши места назначения и DNS, как и любой VPN. Когда приложение резервирует ежедневное подключение, бэкенд также записывает, что аккаунт подключился в это время, но не то, какой узел он использовал. См. сравнение VPN и Центр доверия.

Допуск в Blind Vault (не развёрнут)

Blind Vault — это компонент узла для хранения объектов, зашифрованных клиентом, по анонимным арендам. Он описан в статье MemChain и Blind Vault. Устройство его допуска:

  • V2: клиент ослепляет сообщение допуска по RFC 9474. Сервис прав доступа разрешает выдачу, а отдельный процесс подписания (aeronyx-blind-issuer) подписывает только ослеплённые байты. У этого процесса нет базы данных аккаунтов, хранилища или видимости погашений. Узел проверяет финализированные учётные данные по закреплённой эпохе открытого ключа и в одной транзакции SQLite записывает отметку об использовании и создаёт случайную самоаутентифицирующуюся аренду. Использованные учётные данные не могут создать вторую аренду. Повтор точно того же запроса возвращает ту же аренду.
  • V1: билет на предъявителя с той же таблицей однократного использования. Узел хранит идентификатор билета, поэтому погашение можно связать с выдачей. Он сохраняется только для совместимости.

Узел открывает эти маршруты, только когда включены и Blind Vault, и его публичный API. По умолчанию оба выключены.

http
GET  /api/vault/v1/issuers
POST /api/vault/v1/lease
POST /api/vault/v1/put
POST /api/vault/v1/pull
POST /api/vault/v1/delete

Текущее состояние: Blind Vault не развёрнут на рабочих (production) узлах, официальное приложение не вызывает эти маршруты, и у бэкенда AeroNyx нет эндпоинта прав доступа к Blind Vault. Blind Vault не является продуктом для резервного копирования, архивирования или хранения, и такой продукт не предлагается.

Наблюдаемость

Интерфейсы операторов показывают только агрегированное состояние учётных данных:

  • итоги и доли VPN valid, invalid, missing и malformed, а также режим развёртывания
  • доступность ключей эмитента и грубые группы сбоев

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

Модель угроз и ограничения

Слепые подписи разрывают связь между запросом на выдачу и ваучером. Они не устраняют следующие риски:

  • корреляцию по времени между записями бэкенда о выдаче или резервировании подключений и записями узла о сессиях, особенно когда одна сторона видит и то, и другое
  • то, что узел видит ваш IP-адрес, места назначения и DNS
  • кражу, передачу или перепродажу ваучера, пока опубликована эпоха его ключа, поскольку узлы не обеспечивают однократное использование
  • подключения без ваучера, которые по-прежнему принимаются в режиме reject_invalid
  • ошибки ротации ключей эмитента или скомпрометированные клиенты

Карта исходного кода

УровеньПуть в репозитории узлаРоль
Верификатор VPNcrates/aeronyx-server/src/voucher_verifier.rsРазбирает AVCH, получает ключи эпох, проверяет ваучеры и записывает агрегированные результаты
Слепой подписантcrates/aeronyx-blind-issuer/src/signer.rs, api.rsСлепое подписание RSA без идентичности для Blind Vault V2
Контракты передачи данныхcrates/aeronyx-core/src/protocol/blind_vault.rsСообщения допуска по RFC 9474, эпохи ключей и идентификаторы использования
Сервис и API Blind Vaultcrates/aeronyx-server/src/services/blind_vault.rs, api/blind_vault.rsДопуск, атомарное использование и аренда, маршруты объектов
Конфигурация Blind Vaultcrates/aeronyx-server/src/config_blind_vault.rsПо умолчанию выключен; правила закрепления и ротации эмитентов

ПО узлов имеет открытый исходный код под лицензией AGPL-3.0 на github.com/AeroNyxNetwork/AeroNyx. Исходный код приложения не открыт.

<!-- faq:start -->

Часто задаваемые вопросы

Знает ли VPN-узел AeroNyx, каким кошельком я заплатил?

Не для подключений с ваучером, которые использует официальное приложение. Узел проверяет слепо подписанный ваучер и временный ключ рукопожатия, ни один из которых не связан с вашим кошельком. Устаревший клиент, который подключается с ключом своей идентичности, действительно раскрывает этот ключ узлу.

Можно ли использовать ваучер более одного раза?

Да. Узлы проверяют подпись по опубликованному ключу для эпохи ваучера, но не ведут список использованных ваучеров. Квоты обеспечивает бэкенд.

Нужен ли ваучер для подключения?

Пока нет. Узлы отклоняют некорректно сформированные или недействительные ваучеры, но по-прежнему принимают подключения совсем без ваучера, чтобы старые клиенты продолжали работать.

Где публикуются ключи эмитента ваучеров?

Они публикуются по адресу https://api.aeronyx.network/api/voucher/issuer/keys/, сгруппированные по эпохам. Узлы кешируют эти ключи на один час.

Доступен ли Blind Vault в приложении?

Нет. Допуск в Blind Vault реализован в ПО узлов, но по умолчанию отключён, не развёрнут и не используется официальным приложением. AeroNyx не предлагает продуктов для резервного копирования или хранения.

<!-- faq:end -->