Bot Access Control Легко

Web Bot Auth: как боту криптографически доказать, кто он

Что такое Web Bot Auth и HTTP Message Signatures (RFC 9421), зачем подписывать запросы агентов, пример, ошибки и как проверить.

Обновлено:

Что это

Web Bot Auth — способ для бота криптографически доказать свою личность. Запрос подписывается по RFC 9421 (HTTP Message Signatures), а сайт публикует публичные ключи в директории по well-known-пути (/.well-known/http-message-signatures-directory, формат JWKS). Проверяющий сверяет подпись с опубликованным ключом — и видит, что бот настоящий, а не подделка под User-Agent.

Зачем это AI-агентам

User-Agent легко подделать: вредонос притворяется «GPTBot». Подпись подделать нельзя без приватного ключа. Это позволяет сайтам пускать проверенных агентов и блокировать самозванцев — то есть открывать контент «хорошим» ботам без риска. Для оператора агента это пропуск туда, где анонимных ботов режут.

Минимальный рабочий пример

Бот подписывает запрос (Ed25519) и шлёт заголовки:

GET /data HTTP/1.1
Host: example.com
Signature-Input: sig1=("@method" "@authority" "@path");keyid="agent-key-1";alg="ed25519"
Signature: sig1=:MEUCIQ...base64...:

Сайт-владелец публикует свои публичные ключи:

GET /.well-known/http-message-signatures-directory HTTP/1.1
{ "keys": [ { "kty": "OKP", "crv": "Ed25519", "x": "...", "kid": "scanner-key-1" } ] }

Правильно vs неправильно

ПравильноНеправильно
Подпись по RFC 9421, ключ Ed25519Самодельная схема подписи
JWKS-директория по well-known-путиКлючи нигде не опубликованы — подпись не проверить
keyid в подписи указывает на ключ из JWKSkeyid не совпадает с опубликованным
Покрыты ключевые компоненты (@method, @path…)Подписан только пустой набор — бессмысленно

Типичные ошибки

  • JWKS недоступен (404) — проверяющий не может валидировать подпись.
  • keyid в Signature-Input не соответствует ключу в директории.
  • Рассинхрон ключей после ротации — старый ключ убрали, подписи ломаются.
  • Подписан слишком узкий набор компонентов — подпись не защищает запрос.

Как проверить

Скан проверит наличие и валидность JWKS-директории. Вручную:

curl -s https://example.com/.well-known/http-message-signatures-directory | jq .

Должен вернуться валидный JWKS с массивом keys (Ed25519, с kid).

Источники