Примечание
Развертывание в сети завершено. См. SPEC для официальной спецификации.
Обзор
Это предложение касается расширения фида подписки на адрес с командами, чтобы позволить серверам имен транслировать обновления записей от владельцев хостов. Реализовано в версии 0.9.26.
Мотивация
В настоящее время серверы подписки hosts.txt просто отправляют данные в формате hosts.txt, который выглядит следующим образом:
example.i2p=b64destination
Есть несколько проблем с этим:
- Владельцы доменных имен не могут обновить назначение, связанное с их доменными именами (например, чтобы обновить ключ подписи на более сильный тип).
- Владельцы доменных имен не могут произвольно отказаться от своих доменных имен; они должны передать соответствующие приватные ключи назначения новому владельцу.
- Нет способа аутентификации поддомена как контролируемого соответствующим базовым именем хоста; в настоящее время это контролируется индивидуально на некоторых серверах имен.
Дизайн
Это предложение добавляет ряд командных строк в формат hosts.txt. С этими командами серверы имен могут расширять свои услуги для предоставления ряда дополнительных функций. Клиенты, которые реализуют это предложение, смогут прослушивать эти функции через обычный процесс подписки.
Все командные строки должны быть подписаны соответствующим назначением. Это гарантирует, что изменения вносятся только по запросу владельца доменного имени.
Последствия с точки зрения безопасности
Это предложение не имеет последствий для анонимности.
Происходит увеличение риска, связанного с потерей контроля над ключом назначения, так как кто-то, кто его получит, может использовать эти команды для внесения изменений в любые связанные с ним доменные имена. Но это не больше проблема, чем текущая ситуация, когда кто-то, получивший назначение, может выдавать себя за доменное имя и (частично) перехватывать его трафик. Увеличенный риск также сбалансирован тем, що владельцы доменных имен получают возможность изменить назначение, связанное с доменным именем, в случае, если они считают, что назначение было скомпрометировано; это невозможно в текущей системе.
Спецификация
Новые типы строк
Это предложение добавляет два новых типа строк:
Команды добавления и изменения:
example.i2p=b64destination#!key1=val1#key2=val2 ...Команды удаления:
#!key1=val1#key2=val2 ...
Порядок
Фид необязательно должен быть упорядоченным или полным. Например, команда изменения может быть на строке перед командой добавления или без команды добавления.
Ключи могут быть в любом порядке. Дубликаты ключей не допускаются. Все ключи и значения чувствительны к регистру.
Общие ключи
Требуются во всех командах:
sig Подпись в формате B64, используя ключ подписи от назначения
Ссылки на второе доменное имя и/или назначение:
oldname Второе доменное имя (новое или измененное) olddest Второе назначение в формате b64 (новое или измененное) oldsig Вторая подпись в формате b64, используя ключ подписи от nolddest
Другие общие ключи:
action Команда name Доменное имя, присутствует только если не предшествует example.i2p=b64dest dest Назначение в формате b64, присутствует только если не предшествует example.i2p=b64dest date В секундах с начала эпохи expires В секундах с начала эпохи
Команды
Все команды, кроме команды “Add”, должны содержать ключ/значение “action=command”.
Для совместимости со старыми клиентами, большинство команд предшествуют example.i2p=b64dest, как указано ниже. Для изменений это всегда новые значения. Любые старые значения включены в раздел ключей/значений.
Перечисленные ключи обязательны. Все команды могут содержать дополнительные ключи/значения, не определенные здесь.
Добавить доменное имя
Предшествует example.i2p=b64dest ДА, это новое доменное имя и назначение. action НЕ включается, подразумевается. sig Подпись
Пример:
example.i2p=b64dest#!sig=b64sig
Изменить доменное имя
Предшествует example.i2p=b64dest ДА, это новое доменное имя и старое назначение. action changename oldname старое доменное имя, которое будет заменено sig подпись
Пример:
example.i2p=b64dest#!action=changename#oldname=oldhostname#sig=b64sig
Изменить назначение
Предшествует example.i2p=b64dest ДА, это старое доменное имя и новое назначение. action changedest olddest старое назначение, которое будет заменено oldsig подпись, использующая olddest sig подпись
Пример:
example.i2p=b64dest#!action=changedest#olddest=oldb64dest#oldsig=b64sig#sig=b64sig
Добавить псевдоним доменного имени
Предшествует example.i2p=b64dest ДА, это новое (псевдонимное) доменное имя и старое назначение. action addname oldname старое доменное имя sig подпись
Пример:
example.i2p=b64dest#!action=addname#oldname=oldhostname#sig=b64sig
Добавить псевдоним назначения
(Используется для обновления криптографии)
Предшествует example.i2p=b64dest ДА, это старое доменное имя и новое (альтернативное) назначение. action adddest olddest старое назначение oldsig подпись, использующая olddest sig подпись, использующая dest
Пример:
example.i2p=b64dest#!action=adddest#olddest=oldb64dest#oldsig=b64sig#sig=b64sig
Добавить поддомен
Предшествует subdomain.example.i2p=b64dest ДА, это новое имя поддомена и назначение. action addsubdomain oldname доменное имя более высокого уровня (example.i2p) olddest назначение более высокого уровня (для example.i2p) oldsig подпись, использующая olddest sig подпись, использующая dest
Пример:
subdomain.example.i2p=b64dest#!action=addsubdomain#oldname=example.i2p#olddest=oldb64dest#oldsig=b64sig#sig=b64sig
Обновить метаданные
Предшествует example.i2p=b64dest ДА, это старое доменное имя и назначение. action update sig подпись
(добавьте любые обновленные ключи здесь)
Пример:
example.i2p=b64dest#!action=update#k1=v1#k2=v2#sig=b64sig
Удалить доменное имя
Предшествует example.i2p=b64dest НЕТ, эти данные указаны в опциях action remove name доменное имя dest назначение sig подпись
Пример:
#!action=removeall#name=example.i2p#dest=b64destsig=b64sig
Удалить все с этим назначением
Предшествует example.i2p=b64dest НЕТ, эти данные указаны в опциях action removeall name старое доменное имя, только для информации dest старое назначение, все с этим назначением будут удалены sig подпись
Пример:
#!action=removeall#name=example.i2p#dest=b64destsig=b64sig
Подписи
Все команды должны содержать ключ/значение подписи “sig=b64signature”, где подпись для других данных, используя ключ подписи назначения.
Для команд, включающих старое и новое назначение, должна также быть oldsig=b64signature, и либо oldname, olddest, либо оба.
В команде добавления или изменения открытый ключ для проверки находится в назначении, которое будет добавлено или изменено.
В некоторых командах добавления или редактирования может быть дополнительное назначение, например, при добавлении псевдонима или изменении назначения или доменного имени. В этом случае должна быть включена вторая подпись, и обе должны быть проверены. Вторая подпись — это “внутренняя” подпись и подписывается и проверяется первой (исключая “внешнюю” подпись). Клиент должен предпринять любые дополнительные действия, необходимые для проверки и принятия изменений.
oldsig всегда является “внутренней” подписью. Подпишите и проверьте без наличия ключей ‘oldsig’ или ‘sig’. sig всегда является “внешней” подписью. Подпишите и проверьте с присутствующим ключом ‘oldsig’, но без ключа ‘sig’.
Входные данные для подписей
Чтобы создать байтовый поток для создания или проверки подписи, сериализуйте следующим образом:
- Удалите ключ “sig”
- Если вы проверяете с помощью oldsig, также удалите ключ “oldsig”
- Только для команд добавления или изменения, выведите example.i2p=b64dest
- Если какие-либо ключи остаются, выводите “#!”
- Сортируйте опции по ключу UTF-8, провалитесь, если ключи дублируются
- Для каждого ключа/значения выводите key=value, за которым (если это не последний ключ/значение) следует ‘#’
Примечания
- Не выводите новую строку
- Кодировка вывода — UTF-8
- Вся кодировка назначения и подписи в формате Base 64, используя алфавит I2P
- Ключи и значения чувствительны к регистру
- Доменные имена должны быть в нижнем регистре
Совместимость
Все новые строки в формате hosts.txt реализованы с использованием символов-комментариев в начале, поэтому все более старые версии I2P будут интерпретировать новые команды как комментарии.
Когда маршрутизаторы I2P обновятся до новой спецификации, они не будут переинтерпретировать старые комментарии, но начнут слушать новые команды в последующих загрузках их фидов подписки. Поэтому важно, чтобы серверы имен сохраняли командные записи каким-то образом или включали поддержку etag, чтобы маршрутизаторы могли получать все прошлые команды.