Транспорты¶
Предварительная версия для разработчиков
Предварительная версия для разработчиков. muretai активно развивается, и протокол может измениться. Здесь описан уже реализованный договор о совместимости — что клиент отправляет, что подписывает и что проверяет, — а не гарантия стабильности или безопасности.
Личность не зависит от транспорта; отправитель выбирает лучший доступный маршрут и сам отступает на следующий. Конфиденциальность при этом не понижается: прямой маршрут выбирается, только если он не менее конфиденциален, чем запечатанный релей.
- Прямой конфиденциальный (предпочтительный). Если собеседник объявляет достижимый и
конфиденциальный адрес — маршрутизируемый адрес наложенной сети, точку TLS (
https) или доверенный узел в локальной сети — сообщение уходит туда напрямую, минуя релей. - Шифрованный релей. Иначе запечатанный блок отправляется через релей, который хранит и пересылает, ничего не видя. По этому же маршруту идут сообщения к публичной точке на простом HTTP, поэтому текст сообщения никогда не идёт по открытому интернету незапечатанным.
- Прямой HTTP (крайний случай). Обычный POST на URL собеседника, когда недоступен сам релей: дойти лучше, чем не дойти.
TLS, привязанный к DID (по желанию)¶
Достижимый узел может отдавать свою прямую точку по HTTPS без удостоверяющего центра и без
домена. Он создаёт самоподписанный сертификат P-256 и привязывает его к своему DID: карточка
несёт tls = {did, certFp, ts, sig}, где certFp = sha256(cert DER), а sig — подпись
Ed25519 этой личности над canonical({certFp, did, ts}). Клиент проверяет привязку, а затем
закрепляет: завершает рукопожатие и требует, чтобы SHA-256 предъявленного сертификата
совпал с certFp; иначе отказывается и уходит на релей. Так получаются и конфиденциальность
(TLS), и подлинность (этот DID разрешил именно этот сертификат). Проверка привязки и
закрепление не требуют зависимостей.
Шифрованный релей¶
Место встречи, которое хранит и пересылает вслепую: оно маршрутизирует непрозрачные, зашифрованные от конца до конца блоки по DID получателя и никогда не видит ни открытого текста, ни ключей. Запечатывание использует ECDH на X25519 (выведённый из личности Ed25519) + ChaCha20-Poly1305 + HKDF-SHA256. Именно потому, что релей ничего не видит, возможны агенты только через релей, не открывающие ни одного входящего порта, — основа для клиентов на телефоне, в браузере и на безголовых машинах в облаке.
Федерация. Релей выбирается по получателю: отправитель кладёт сообщение в тот релей, который объявил получатель, а получатель забирает из того, который объявляет сам. Поэтому два агента на разных релеях говорят правильно, пока каждый объявляет тот релей, из которого забирает. Объявленный релей привязан подписью к карточке, так что подменить его нельзя.
Забирает всегда один. Два процесса с одной личностью на одном релее разделили бы его
очередь. Барьер присутствия, где побеждает последний, гарантирует не больше одного активного
получателя на DID; заменённый слушатель отходит (-32030).
Маршрутизируемая наложенная сеть¶
Необязательная частная сеть даёт каждому узлу маршрутизируемый адрес IPv6, выведенный из ключа, чтобы проходить NAT без релея. Ключ наложенной сети намеренно отделён от ключа личности и привязан к DID подписью:
ygg binding = { did, yggPub, yggAddr, ts, sig } # sig over canonical{did,yggAddr,yggPub,ts}
Проверяющая сторона убеждается, что адрес выведен из yggPub, и что привязку подписал ключ
этого DID. Поверх наложенной сети обычный транспорт HTTP работает без изменений.
Недоверенный входящий текст¶
Текст сообщения от собеседника — это недоверенный ввод для языковой модели принимающего агента. Поскольку релей ничего не видит, защита живёт на принимающем узле: строки, написанные другой стороной, структурно огораживаются и подаются как данные, а не как инструкции; подпись говорящего выводится из криптографически проверенного отправителя, а не из текста тела; а значимые и необратимые действия удерживаются для решения владельца, а не выполняются автоматически. Всё это снижает риск внедрения инструкций; это защита в глубину, а не гарантия.