Edited at
HTTP2Day 12

Firefox で HTTP/2 プロキシーを使う

More than 3 years have passed since last update.

Firefox で HTTP/2 プロキシーを使う方法を説明する記事です.

従来, HTTP プロキシーへの接続は平文の HTTP を使うことが一般的でした.

セキュア Web プロキシーというのが最近出てきました.

リンク先から分かるようにもともと Chromium 発祥のもののようですが, クライアントと HTTP プロキシー間の通信路を SSL/TLS で暗号化するというものです.

Google の Data Compression Proxy もセキュア Web プロキシーの一形態でクライアントと HTTP プロキシー間に SPDY プロトコルを使っています.

SPDY プロトコルを使っているため SPDY プロキシーと呼ばれることもあります.

HTTP/2 プロキシーも同様に, セキュアプロキシーの一形態であり, クライアントと HTTP プロキシー間を HTTP/2 プロトコルを使います.

まず HTTP/2 プロキシーを用意しましょう.

nghttp2 プロジェクトで開発している nghttpx を HTTP/2 プロキシーとして使うことができます.

nghttpx は HTTP/2 プロキシーのフロントエンドとして機能し, 別途用意する HTTP/1 プロキシーをバックエンドとして使います.

この HTTP/1 プロキシーとしては Squid や Trafficserver など, 従来の HTTP/1 フォワードプロキシーならなんでも使うことができます.

ここでは Squid を使うことにします.

Squid が 127.0.0.1:3128 を listen しているとし, nghttpx を同じホストの 8443 ポートで動作させる場合は以下のように nghttpx を起動します:

$ nghttpx -s -f'*,8443' -b127.0.0.1,3128 server.key server.crt

-sは HTTP/2 プロキシーとして動作させるオプションです.

server.key と server.crt はそれぞれサーバーの SSL/TLS 秘密鍵と証明書のファイルパスです (PEM 形式).

次に Firefox の設定です.

この原稿執筆時点での最新 stable である Firefox 34 を前提に説明します.

まず about:config で network.http.spdy.enabled.http2draft を true にして HTTP/2 を有効にします.

セキュア Web プロキシーを使う場合は PAC ファイルを作成する必要があります.

PAC ファイルはネットワーク経由でもローカルファイルシステムから直接読み込むこともできます.

以下のような PAC ファイルを作成します:


function FindProxyForURL(url, host) {
return "HTTPS SERVERADDR:8443";
}

SERVERADDR は nghttpx が動いているサーバーのホスト名です.

このホスト名は重要で, Firefox は SSL/TLS ハンドシェークでのサーバー証明書確認の際にこのホスト名を元に証明書を確認を行います.

ホスト名が CN や subjectAltName 記載のものと違う場合はエラーになってプロキシーとして使うことがきません.

当然証明書チェーンが検証されるので自己署名証明書の場合はエラーになってしまいます.

自己責任でこのような証明書を受け入れる場合は, Firefox の URL に HTTP/2 プロキシーのアドレスを "https://" を前につけて入力してセキュリティ例外を設定します.

上記の PAC ファイルだとすべてのトラッフィクを HTTP/2 プロキシーへ送信します.

https URI は従来どおり CONNECT メソッドで接続した後, 個々のストリームで end-to-end 暗号化されるのでプロキシーにおいて通信内容を見ることはできませんが, https URI はプロキシー経由したくないという場合はそういうふうに記述することも可能です.

PAC ファイルの記述サンプルについては Ilya の記事 を参考にしてください.

PAC ファイルの指定の方法は従来と同じです.

ローカルファイルシステムから参照する場合は, file:// スキームが使えます.

この時点で HTTP/2 プロキシー経由で通信ができるはずです.

動かない場合は 1 度 Firefox を再起動してみるといいでしょう.

一番躓きやすいのでは SSL/TLS 証明書の部分だと思います.

実は Android の Firefox でも同様の設定を施すことが可能です.

Android 版 Firefox ではプロキシーを設定する専用画面がありませんが, about:config からすべて設定可能です.

PAC ファイルの指定は network.proxy.autoconfig_url で指定します.

このPACファイルを有効にするため, network.proxy.type を2にします.

network.http.spdy.enabled.http2draft も忘れずに true にしておきましょう.

これで Android 版 Firefox からも HTTP/2 プロキシーを使うことができるようになったはずです.

証明書の扱いはデスクトップ版と同じですから上で述べたような方法で対処してください.

余談ですが, 現在の仕様では "HTTP2.0" ではなく "HTTP/2" もしくは "HTTP2" が正しい名称です.