KeycloakのSPDY_PROTOCOL_ERRORの原因と対策について

ふと、QiitaのKeycloak関連の記事を眺めていたら、こんな記事を見つけました。

冗長構成にしたKeycloakの言語設定を日本語にすると、Keycloakの前段にあるロードバランサーやプロキシーサーバー(例えば、Apache)がKeycloakからのレスポンスをクライアントに返さなくなるという内容です。

この記事のコメント欄でosakichiさんが詳しくコメントをされているように、「HTTPレスポンス分割」攻撃の脆弱性に対するロードバランサーやプロキシーサーバーの対策が影響しています。

プロキシやロードバランサではレスポンス分割攻撃への対策のため、
制御文字を含むレスポンスヘッダーがあった場合はエラーとして転送を中止しますが、
日本語の文字化けしたP3Pヘッダーの中身にはコード0x01の文字が含まれているため
この攻撃対策に引っかかってエラーとなってしまっているようです。

Keycloakの日本語プロパティ・ファイル(messages_ja.properties)からp3pPolicyの定義を削除すれば事象は解決するのですが、「そもそもレスポンスヘッダーに誰がこんな余計な日本語化したんだ?」と一瞬思ってすぐに気づきました…

yarakasu

自分でした…(ご迷惑おかけしてすいません)。直接的な原因となったのは、私の日本語対応のプルリクエストで、4.6.0.Final以降で発生します。

ということで、修正してプルリクエストすることにしました。

修正するにあたって、まずはこの問題をJIRAに登録する必要があります。が、念のためJIRAを検索してみたら、既に問題が登録されていました。やはり、日本の方が登録したようです。

この問題でお困りの方は、JIRAにログインして「Vote for this issue」をクリックして下さい。

次に修正ですが、その前にP3Pヘッダーが何であるか調査しないといけません。実は正直言って私は初耳でした。そもそもP3Pヘッダーって何なんでしょう?調べてみたところ、この仕様自体はかなり昔からあるようです。日本語化された仕様書がありましたが(以下)、それによると2000年に勧告されたもののようです。

こんな仕様、普及しないようなぁと思いましたが、実際その通りで、以下の記事にあるように、2012年の時点で既に形骸化されていたようです。

唯一サポートしていたMicrosoftのブラウザー(Edge)も、現在は「deprecated」(非推奨)の扱いになっているようです。詳しくはWikipediaのP3Pのページを読んでみて下さい。

ということなので、古いバージョンのMicrosoftのブラウザーでKeycloakを利用しているユーザーがP3Pのポリシー違反エラーにならないように、あるバージョンからKeycloakが修正された(KeycloakがP3Pヘッダーを付けるようになった)のではないかと予想できます。そこでKeycloakのJIRAを調べてみると、やはりありました。

このページでレポーターも言っている通り、P3Pヘッダーの値は何でもいいということになります。

If I have understood correctly IE doesn’t really care about the header’s value as long as it has been set.

もちろん日本語化する必要もありません。対策の仕方の選択肢として、ヘッダー値を適切にエンコードするということも考えられましたが、それよりも多言語対応をやめた方がいいと私は判断しました。どちらにしてもブラウザの動作に変わりは無いし、仮にこのメッセージがユーザーの目にとまったとしても、意味は分からないでしょうし。

ということでプルリクエストしておきました。

2019/05/16 追記 :

2019/05/15にmasterにマージされました。7.0.0以降であれば、この問題は出ません。