Протокол манифеста
Протокол открыт: любой клиент может его поддержать, любой оператор — держать свою точку встречи. Каноническое описание и обоснование — 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, тело — строка.
Правила клиента
- Проверять подпись всегда; ключ должен совпадать с закреплённым или с
объявленным
next_key,id— с закреплённым. - Закреплять ключ (TOFU) только по манифесту из ответа основного адреса.
seqменьше принятого — отказ; равный — ничего нового.- Молча принимать только манифест с основного адреса, который не меняет
origin. Сменаoriginи новые хосты из зеркала или точки встречи — только после согласия пользователя. Отказ запоминать поseq. - Принятая смена адреса меняет в URL подписки схему, хост и порт; путь и запрос сохраняются.
- Зеркала — когда основной адрес не ответил подпиской; точка встречи — после такого отказа не чаще раза в 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).