Протокол манифеста

Протокол открыт: любой клиент может его поддержать, любой оператор — держать свою точку встречи. Каноническое описание и обоснование — ADR-0019.

Формат

v1.<base64url(JSON)>.<base64url(подпись)>

base64url — без =. Подпись — Ed25519 (RFC 8032) над ASCII-байтами v1.<base64url(JSON)>. Длина строки — не больше 4096 символов.

{
  "v": 1,
  "id": "axm",
  "seq": 3,
  "iat": 1791160000,
  "origin": "https://sub.example.online",
  "mirrors": ["https://sub2.example.site"],
  "rendezvous": ["https://commy.makhkets.ru/r/axm"],
  "key": "<32 байта публичного ключа, base64url>",
  "next_key": "<необязательно>",
  "name": "AXM VPN"
}
Поле Правило
v ровно 1
id 1–64 символа [A-Za-z0-9_-]
seq целое ≥ 1, строго растёт
iat секунды Unix
origin http(s)://хост[:порт] — без пути, запроса, фрагмента и user info
mirrors до 8 origin-ов той же формы
rendezvous до 4 полных https-URL без user info и фрагмента
key ключ, которым подписан манифест
next_key объявленная ротация ключа
name до 64 символов

Доставка

  • Заголовок ответа подписки: commy-manifest: <строка>.
  • Точка встречи: GET <rendezvous> → 200 text/plain, тело — строка.

Правила клиента

  1. Проверять подпись всегда; ключ должен совпадать с закреплённым или с объявленным next_key, id — с закреплённым.
  2. Закреплять ключ (TOFU) только по манифесту из ответа основного адреса.
  3. seq меньше принятого — отказ; равный — ничего нового.
  4. Молча принимать только манифест с основного адреса, который не меняет origin. Смена origin и новые хосты из зеркала или точки встречи — только после согласия пользователя. Отказ запоминать по seq.
  5. Принятая смена адреса меняет в URL подписки схему, хост и порт; путь и запрос сохраняются.
  6. Зеркала — когда основной адрес не ответил подпиской; точка встречи — после такого отказа не чаще раза в 15 минут, и раз в сутки при успешных обновлениях. Запрос к точке встречи — без идентификаторов.

Подписать без браузера

commy-cloud keygen -project axm -o axm-key.json
commy-cloud sign -key axm-key.json -seq 1 \
  -origin https://sub.example.ru \
  -mirror https://sub2.example.org \
  -rendezvous https://commy.makhkets.ru/r/axm \
  -name "AXM VPN"
commy-cloud verify v1.…

Файл ключа — тот же JSON, что скачивает дэшборд (private_key — PKCS#8 в base64url).