Кратко

  • RFC 9729 позволяет заранее подготовленному клиенту доказать право доступа уже в первом запросе: свежесть даёт TLS exporter, поэтому серверу не требуется сначала отвечать вызовом 401 и подтверждать существование функции.
  • Доказательство связано с соединением и контекстом origin, но не с методом, путём или телом HTTP. Повторное использование соединений, TLS-терминатор и доверенная передача на backend становятся частью границы аутентификации.
  • Публичный ответ «здесь ничего нет» не может быть внутренним диагнозом. Причина отказа, поколение ключевой базы, отзыв, авторизация и фактическая выдача ресурса должны оставаться раздельными проверяемыми событиями.

Представим закрытый интерфейс управления. Неизвестный посетитель получает тот же ответ, что и на адрес, которого никогда не существовало. Авторизованный клиент обращается к тому же URL с параметрами Concealed и получает услугу. Сервер заранее не сообщил, что здесь ожидаются учётные данные; доказательство было готово до его первого ответа.

RFC 9729 заменяет случайность серверного вызова материалом, экспортированным из TLS-соединения. Клиент подписывает его и может отправить подтверждение без предварительного приглашения. Исчезает один публичный сигнал, но не полномочия тех, кто выдаёт ключи, определяет принимающие origin и свидетельствует о TLS-канале.

Первый контур управления находится вне HTTP

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

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

Полезный реестр связывает издателя, класс субъекта, origin и realm, fingerprint публичного ключа, начало, срок, причину отзыва, поколение распространения и список потребителей. Секрет не журналируется; цепочка решения обязана быть доказуемой.

Границы контекста TLS exporter

Зарегистрированная метка — EXPORTER-HTTP-Concealed-Authentication. В контекст входят номер алгоритма TLS-подписи, ID ключа, публичный ключ, схема URI, host, port и необязательный realm. Из 48 байтов результата 32 участвуют в подписываемом материале, а 16 передаются как проверочный параметр v.

Credential несёт также k, a, p и s. Сервер находит ID, сравнивает представленный ключ с сохранённым, сверяет v с exporter этого соединения и проверяет подпись. Явные сравнения снижают риск путаницы ключей и связывают принятие с нужным каналом.

Метод, путь и тело запроса в контекст не входят. Для одного ключа на одном соединении доказательство может быть одинаковым в разных запросах. Это полезно для сжатия, но превращает изоляцию HTTP/2 и HTTP/3 в условие безопасности: контекст, способный прочитать чужой Authorization, может повторить его в том же соединении.

У свежести есть возраст. Доказательство может быть таким же старым, как долго живущее или возобновлённое соединение. Принудительное переподключение сокращает окно, но расходует handshake, ёмкость и надёжность. Возраст соединения, цепочка resumption и причина обновления должны сохраняться рядом с вердиктом.

TLS-терминатор становится свидетелем личности

В разделённой схеме frontend завершает TLS или QUIC и отправляет backend исходный Authorization вместе с Concealed-Auth-Export. Backend не может вывести материал канала клиент–frontend из собственного соединения и принимает утверждение frontend.

Поэтому поле учитывается только от заранее доверенного отправителя, а frontend обязан удалить одноимённое поле, внедрённое клиентом. Load balancer, который может создать значение, влияющее на принятие личности, — уже не «только транспорт».

Широкого сетевого ACL недостаточно. Доказательство включает аутентифицированную личность frontend, поколения ПО и конфигурации, клиентское соединение, virtual host, нормализованный authority, защищённую корреляцию exporter и итоговый backend route. Потерянный или дублированный header, другой host при построении контекста либо маршрутизация в чужой домен способны дать снаружи лишь безупречный 404.

После криптографических проверок начинается авторизация

Backend разбирает параметры, находит ID, сравнивает ключ, проверяет exporter и подпись. Любое несоответствие обрабатывается как отсутствие credential. Лишь полный набор позволяет считать клиента аутентифицированным; право на операцию из этого не следует.

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

Единый отказ — это политика раскрытия

Для non-probeable ресурса неудачная аутентификация должна получить в точности ответ несуществующего ресурса. Код 404 — только одна координата. Тело, заголовки, cache, закрытие соединения, длина и распределение задержки могут выдать ветвь.

Криптографическая проверка требует времени. Если неизвестный путь возвращается сразу, а защищённый ищет ключ и проверяет подпись, возникает timing oracle. Сравнивать нужно распределения при сходной нагрузке и сети. Индекс, sitemap, ошибка, клиентский bundle, аналитика, документация и DNS также могут раскрыть адрес.

Версия стандарта тоже входит в доказательство

Реестр errata уже содержит практический урок. Подтверждённая errata 8807 исправляет шестнадцатеричный пример: он кодировал HTTP Signature Authentication, хотя нормативная конструкция требует HTTP Concealed Authentication. Реализация, скопировавшая пример, получит скрытую за общим ответом несовместимость.

Errata 8843 пока имеет статус reported и относится к ABNF целого s: напечатанная форма исключает однозначные ненулевые числа, тогда как текст допускает 0–65535. Оператору нужно фиксировать выбранное толкование, версию parser, тесты и изменение статуса.

Записи IANA для scheme, HTTP-поля и exporter label координируют имена и ссылки. Они не доказывают поддержку клиента, правильность выдачи ключей, полноту маршрутов или равенство ответов. Документальная власть и исполняемый эффект принадлежат разным слоям реальности.

Две поверхности с разной детализацией

Публичная поверхность сокращает различия для неавторизованного наблюдателя. Закрытая поверхность для подотчётных операторов различает malformed credential, неизвестный и отозванный ключ, несовпадение публичного ключа или exporter, неверную подпись, неподходящий TLS, недоверенный frontend, отказ авторизации, ошибочный route и downstream failure.

Причины не отражаются в публичном теле или времени. Они связываются с фактами соединения и конфигурации защищённым идентификатором, имеют срок хранения и аудит доступа. Негативная матрица включает настоящий неизвестный путь, concealed-путь без credential, повреждённые данные, неизвестный и отозванный ключ, неверный host или port, неподходящий TLS, внедрённое клиентом поле, недоверенный frontend и отказ после правильной аутентификации. Снаружи нужные классы сходятся, внутри причины остаются различимыми.

Источники