まだDraftなんですが、 Signed HTTP Exchanges という規格があります。規格そのものについて詳しくはJxckさんのブログ記事 WebPackaging の Signed HTTP Exchanges を参照してもらえるといいと思います。

この応用先として、Accelerated Mobile Pages (AMP)を表示する際にオリジナルのURLで表示するというものがあります。SXGを使わない(この記事執筆時点での一般的な状態)のAMPはGoogleだったりAMPProjectのドメインで配信されているはずです。これを、SXGをうまく使ってやることで配信はGoogleなどのAMPキャッシュから行うが、ブラウザのURLバーに表示するのはオリジナルのURLにするということが実現できます。

これを実現するためには、Google Botがクロールしに来た時にSXGがあるということを伝えてやったり、実際にSXGを生成して返してやる必要があります。そのためのAMP PackagerというツールがAMP Projectによって公開されています。

今回、origin、AMP Packagerと、必要に応じてAMP Packagerにアクセスを向けるReverse Proxyの3つをdocker-composeでローカルで動かして動作確認するということをやったのでそれについて解説したいと思います。

AMP PackagerのREADMEにも書いてありますが、Reverse Proxyでの処理は下記のようになります。

  1. /amppkg/ 以下はそのままAMP Packagerに向ける
  2. リクエストに AMP-Cache-Transform ヘッダがある場合は /priv/doc/$scheme://$server_name$request_uri にrewriteしてAMP Packagerに向ける
    • /priv/doc/ 以下に直接アクセスがあった場合にはAMP Packagerに向けない
  3. その他のリクエストはそのままOriginに向ける

また、その他の注意点として、AMPページに対する最終的なレスポンスの Vary ヘッダーに AMP-Cache-TransformAccept を入れてやる必要があります。

それ以外に今回はまったポイントがあるんですが、それはオレオレ証明書を使っていることが原因でした。具体的には

  1. AMP Packagerが使う証明書にはOCSP Serverの情報がないこと。
  2. AMP PackagerからOriginへのfetchがHTTPSで行われる際の証明書エラーが起きる。
  3. Chromeに起動オプションを渡してやらないと証明書エラーが起きる。

それぞれ、下記で解決できました。

  1. amppkgコマンドを実行する前にopensslコマンドでocsp responseを生成してやる。このときopensslコマンドの出力先に、amppkg.tomlで指定したOCSP Cacheのパスを指定する。コマンドは下記。

    1
    2
    
    touch index.txt index.txt.attr
    openssl ocsp -noverify -index ./index.txt -rsigner ca.ocsp.cert -rkey ca.privkey -CA ca.cert -ndays 7 -issuer ca.cert -cert server.cert -respout /tmp/amppkg-ocsp
    
  2. オレオレ認証局の証明書をあらかじめシステムに登録してやる。

  3. Chromeの起動オプション --ignore-certificate-errors-spki-list にカンマ区切りで証明書の情報を渡してやる。

    • 渡す情報は各証明書(server.cert)に対して下記コマンドで取得できる。渡す必要があるのは、TLSに使う証明書とSXGに使う証明書の2つ。
    1
    
    cat server.cert | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
    

使ったコードは https://github.com/Warashi/try-amppackager で公開していますのでぜひ参考にしてください。