pawoo.net と疎通が出来なくなってた件

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