Webクローラーが付加するWeb-Bot-Authの署名を検証してみる

GoogleのクローラーBotがWeb-Bot-Authの仕様を実験実装してたりします。
developers.google.com

Web-Bot-Authでは、Botはリクエストに署名を付けHTTPリクエストを送信してきます。こうすることで、User-Agentだけに頼るのではなく、署名検証を通してそのBotが正規のものか確認できます。これにより、AIの学習をしたりするBotを適切に認証したり、はたまたBotの学習行為に対して課金したりできます。

実際に試す

私の個人サイトへ、Google Botが署名付きでリクエストを送ってきてくれれば良いものの、、、まだ付加してこなさそうです。
アクセスログを見ると、ahrefs.com というBotがWeb-Bot-Auth署名付きのリクエストを送ってきたので、署名検証をしてみます。

署名検証に必要なパラメータ

署名の検証に必要な情報は大体次のとおりです。
基本的なパラメータは『RFC 9421 - HTTP Message Signatures』に則ったパラメータがHTTPリクエストにのかってきます。
(下記jsonは便宜上、json形式で表現しただけで。仕様で定義されているフォーマットでは有りません)

{
  "received_at_unix": 1781486729,
  "authority": "asnokaze.com",
  "headers": {
    "signature": "sig=:+wkpd7nQVTXX2qrvPUiDm2ZXU5Uzdgi759hZgzZmgViGue+zgxa12+ysInY1IBEIjqFUpgG8YzJ8FekBZ6JGAw==:",
    "signature-input": "sig=(\"@authority\" \"signature-agent\");created=1781486729;keyid=\"e3vpiy0B6M1Wdxnizw3dqRSgpqS6SXM2qiQ6HtUwZ5g\";alg=\"ed25519\";expires=1781490329;nonce=\"NcuWdzP41zzBqJr0SAr4RJQQZaKt72aCN8rk_Ee7z_vgaeD-4l7G0PMisYEZnRftOxmoNoFnM-fiJzNaea2ZLg\";tag=\"web-bot-auth\"",
    "signature-agent": "\"https://ahrefs.com\""
  }
}
検証

主な流れは次の通り

  • signature-agentを読み取り、https://ahrefs.com/.well-known/http-message-signatures-directory にアクセスし、keyidに対応する公開鍵を取得する
  • 取得した公開鍵と、各種パラメータ(暗号アルゴリズム, nonce, tag)より、署名値を検証する (署名の範囲は authorityヘッダとsignature-agentヘッダ)
  • 時刻が expires を越えてないことを確認する

これにより、アクセスしたBotがahrefsの正規のBotであることが確認できる

おまけ: 実験コード

上記のような、署名検証に必要な情報をまとめたjsonで、Web-Bot-Authの署名検証をする実験コード
https://gist.github.com/flano-yuki/de66a66fbb64340658393960a566090d