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 в подписи указывает на ключ из JWKS | keyid не совпадает с опубликованным |
Покрыты ключевые компоненты (@method, @path…) | Подписан только пустой набор — бессмысленно |
Типичные ошибки
- JWKS недоступен (404) — проверяющий не может валидировать подпись.
keyidвSignature-Inputне соответствует ключу в директории.- Рассинхрон ключей после ротации — старый ключ убрали, подписи ломаются.
- Подписан слишком узкий набор компонентов — подпись не защищает запрос.
Как проверить
Скан проверит наличие и валидность JWKS-директории. Вручную:
curl -s https://example.com/.well-known/http-message-signatures-directory | jq .
Должен вернуться валидный JWKS с массивом keys (Ed25519, с kid).