TL;DR
リバースプロキシで Accept-Encoding を落とすと Mastodon < 2.5.0 と疎通できなくなる
何があったのか?
pawoo.net のアカウントをフォローしようとすると、鍵でもないのに承認待ちになる問題が報告される。
さらに調べてみると、こっちから Pawoo へのふぁぼブーストは通知されるが、Pawoo 側からは一切通知されないことも判明。
で、とりあえず ActivityPub のレスポンスを見る…と pawoo.net からのリクエストが 401 で落とされていた。
このへんから don.gomasy.jp 側で Pawoo の署名検証がうまくいっていないのでは?疑惑が出てくる。
丼のコードを読む
https://github.com/tootsuite/mastodon/blob/c9dcc2d39fb5bd945ecd999e50c08a86cce1aa3e/app/controllers/concerns/signature_verification.rb#L102-L109署名検証はここの verify_signature が呼ばれて最終的に OpenSSL::PKey::RSA#verify に渡されるらしい。
false で署名間違いらしいんだけど、案の定 false が返ってたのでこの時点で検証失敗で確定っぽかった。
なお、compare_signed_string には署名対象のヘッダーとリクエストボディーの digest が含まれる。
コードだけ見てても分からないのでとりあえず実際の compare_signed_string の中身を見てみることに。
比較してみると、Pawoo はなんか User-Agent と Accept-Encoding も署名してるみたい?
そういえばいろいろあって(後述)リバースプロキシで Accept-Encoding を落としてたな…と思い、
外したら直った(完)
なんで Accept-Encoding 落としてたの?
忘れた
don.gomasy.jp はリバースプロキシとして nginx を利用している。
Mastodon は Puma 側で gzip 圧縮した応答を返すのだが、nginx はこれを素通しするため nginx 側で brotli などの圧縮方式を追加でサポートしたい場合は Accept-Encoding の値を途中で改変しないといけなかった。
そもそもわざわざ brotli 使う必要は…(ry
ところで
User-Agent と Accept-Encoding も署名するのはやりすぎでは?という Issue が上がってた。
関連する PR も 2.5.0 でマージされてるっぽいので Pawoo は早くバージョンをあげて欲しい。
https://github.com/tootsuite/mastodon/issues/8080
https://github.com/tootsuite/mastodon/commit/e3764bdb529d3ec03f8db9fb20862af07d7590d4