サマリ
ActivityPubは連合でやり取りする際のHTTPリクエストにはSignature
ヘッダがついています。
Signature
ヘッダは、いくつかの他のHTTPヘッダを対象に取って、それらの内容を結合したものの署名を作成するというものです。
misskeyではこの署名範囲を(request-target) date host digest
と指定しているので、このどれかの内容が途中で書き換えられてしまうと署名が無効になってしまいます。
apacheでリバースプロキシを組むと、デフォルトでHost
ヘッダが書き換わり、元の内容が X-Forwarded-Host
に入ります。
ので、misskeyが作る署名のhostが、リバースプロキシのhostのまま署名され、そのhostがリバースプロキシにより本来のhostへ書き換えられるため、署名が無効になっていたようです。
misskey側でX-Forwarded-Host
をうまく解釈してくれればいいのですが、そういうのは今のところないみたいです。
なので、apacheの設定の、このmisskeyインスタンスのVirtualHostディレクティブに対しProxyPreserveHost on
を指定したところ、無事連合が動くようになりました。
経緯
Gammalab(自宅のこと)では1台リバースプロキシとしてapacheを置き、その配下に他の仮想マシン・kubernetes loadbalancerを指定しています。
今回misskey用のhelmチャートを作成し、試験的にサービスを起こしてみました。
無事にアクセスできるようになり投稿も自由にできるようになったのですが、どうも他インスタンスのユーザーを見ることはできてもフォローを押すとどうも処理が完了しない・・・ 連合ステータスを見てみても、認識こそされてるもののなかなか連合中にならない・・・。といった状態に陥りました。
テスト用にもう一台misskeyインスタンスを構築し、相互にフォローを飛ばしてみてエラーログが落ちないかを凝視してみましたが、これがダンマリで…
misskeyのエラーログには例えばwebfingerがなんかおかしいとか、そういったことまで事細やかなことが落ちるので何も出て来ないのは想定外で、解決は困難を極めました。
ちょっと前にサマリで紹介したブログをたまたま見ていたので「もしかして!」と気づきましたが、これを見てなかったら一生気づかなかったかもしれません…。
おまけ
misskeyではリバースプロキシとしてNginxが推奨されておりコンフィグ例もおいてありますがapache版はありませんので、僕のapacheの設定を参考として紹介しておきます。
|
|
参考リンク
Signature
ヘッダについてはこちらのブログHTTPメッセージに署名をするSignatureヘッダの標準化が詳細に解説してくださっています。RFCを読むのは大変骨が折れるため、こうして簡単に説明してくださる方には頭が上がりません…。ありがとうございます。