SXG 拡張機能を含む TLS 証明書を生成する方法、SXG ファイル生成ツールをインストールする方法、SXG ファイルを提供するように nginx を構成する方法について説明します。
Signed HTTP Exchange(SXG)は、ユーザーがコンテンツ作成者とコンテンツ配信会社を簡単に区別できるようにする新しいウェブ技術です。このガイドでは、SXG の設定方法について説明します。
クロスブラウザ サポート
SXG は、Google Chrome、Samsung Internet、Microsoft Edge など、Chromium ベースのいくつかのブラウザに対応しています。最新情報については、送信元で署名された HTTP 交換のコンセンサスと標準化のセクションをご覧ください。
前提条件
ウェブサイトに SXG を実装するには、次の要件を満たす必要があります。
- DNS エントリを含め、ドメインを制御する。
- 証明書を取得します。SXG では専用の証明書の発行が必要です。特に、TLS 鍵や証明書は再利用できません。
- HTTPS 経由で SXG を生成、提供できる HTTP サーバーを用意します。
前提条件
このガイドは、次のことを前提としています。
- OpenSSL 1.1.1 環境がある。このガイドは amd64 ISA 上の Ubuntu 18.04 LTS を使用して作成されています。
sudo
を実行して実行可能ファイルをインストールできる。nginx
を HTTP サーバーとして使用します。- 現在、SXG 関連の拡張機能をサポートしているプロバイダは DigiCert のみであるため、この DigiCert を使用して証明書を生成しています。
また、この記事のコマンド例ではドメインが website.test
であると仮定しているため、website.test
を実際のドメインに置き換える必要があります。
手順 1: SXG の証明書を取得する
SXG を生成するには、CanSignHttpExchanges
拡張子を持つ TLS 証明書と、特定の鍵タイプが必要です。DigiCert は、この拡張機能を使用して証明書を提供します。証明書の発行には CSR ファイルが必要なため、次のコマンドを使用して生成します。
openssl ecparam -genkey -name prime256v1 -out mySxg.key
openssl req -new -key mySxg.key -nodes -out mySxg.csr -subj "/O=Test/C=US/CN=website.test"
次のような CSR ファイルが取得されます。
-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----
次の点を確認してください。
- 有効期間が 90 日を超えていない。
- [その他の証明書オプション] にある [証明書に CanSignHttpExchanges 拡張機能を含める] チェックボックスがオンになっている。
証明書がこれらの条件に一致しない場合、セキュリティ上の理由から、ブラウザとディストリビュータによって SXG が拒否されます。
このガイドでは、DigiCert から取得した証明書のファイル名が mySxg.pem
であることを前提としています。
ステップ 2: libsxg
をインストールする
SXG 形式は複雑で、ツールを使用せずに生成するのは困難です。SXG は、次のいずれかのオプションを使用して生成できます。
- Go で記述された gen-signedexchange ツール。
- C で記述された
libsxg
ライブラリ。
このガイドでは libsxg
を使用します。
オプション 1: Debian パッケージから libsxg
をインストールする
OpenSSL(libssl-dev
)のバージョンが一致していれば、通常の Debian でパッケージをインストールできます。
sudo apt install -y libssl-dev
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg0_0.2-1_amd64.deb
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg-dev_0.2-1_amd64.deb
sudo dpkg -i libsxg0_0.2-1_amd64.deb
sudo dpkg -i libsxg-dev_0.2-1_amd64.deb
オプション 2: libsxg
を手動でビルドする
.deb
ファイルと互換性のある環境を使用していない場合は、自分で libsxg
をビルドできます。前提条件として、git
、cmake
、openssl
、gcc
をインストールする必要があります。
git clone https://github.com/google/libsxg
mkdir libsxg/build
cd libsxg/build
cmake .. -DRUN_TEST=false -DCMAKE_BUILD_TYPE=Release
make
sudo make install
ステップ 3: nginx
プラグインをインストールする
nginx
プラグインを使用すると、配信前に SXG を静的に生成するのではなく、動的に生成できます。
オプション 1: Debian パッケージからプラグインをインストールする
nginx
の SXG モジュールは GitHub で配布されています。Debian ベースのシステムでは、バイナリ パッケージとしてインストールできます。
sudo apt install -y nginx=1.15.9-0
wget https://github.com/google/nginx-sxg-module/releases/download/v0.1/libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb
sudo dpkg -i libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb
オプション 2: プラグインを手動でビルドする
nginx
モジュールをビルドするには、nginx
ソースコードが必要です。以下のコマンドを使用して、SXG 動的モジュールとともに tarball を入手し、ビルドできます。
git clone https://github.com/google/nginx-sxg-module
wget https://nginx.org/download/nginx-1.17.5.tar.gz
tar xvf nginx-1.17.5.tar.gz
cd nginx-1.17.5
./configure --prefix=/opt/nginx --add-dynamic-module=../nginx-sxg-module --without-http_rewrite_module --with-http_ssl_module
make
sudo make install
nginx
構成は柔軟性に優れています。nginx
をシステムの任意の場所にインストールしてから、それぞれのパス module/config/log/pidfile
を指定します。このガイドでは、/opt/nginx
にインストールしていることを前提としています。
ステップ 4: SXG と連携するように nginx
プラグインを構成する
オプション 1: Debian からインストールされた nginx
モジュールを構成する
以前のステップ 3、オプション 1 を使用した場合は、次の手順を行います。
SXG コンテンツの配信には HTTPS が必要です。SSL/TLS 証明書は、DigiCert や Let's Encrypt などのサービスから取得できます。なお、SXG 証明書を SSL に使用することはできません(その逆も同様です)。そのため、2 つの証明書が必要になります。SSL 鍵/証明書ペアを /path/to/ssl/
に、SXG 鍵/証明書ペアを /path/to/sxg/
に配置していると仮定した場合、/etc/nginx/nginx.conf
の構成ファイルは次のようになります。
user www-data;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
include mime.types;
default_type application/octet-stream;
add_header X-Content-Type-Options nosniff;
server {
listen 443 ssl;
ssl_certificate /path/to/ssl/fullchain.pem;
ssl_certificate_key /path/to/ssl/privkey.pem;
server_name website.test;
sxg on;
sxg_certificate /path/to/sxg/mySxg.pem;
sxg_certificate_key /path/to/sxg/mySxg.key;
sxg_cert_url https://website.test/certs/cert.cbor;
sxg_validity_url https://website.test/validity/resource.msg;
sxg_cert_path /certs/cert.cbor;
root /var/www/html;
}
}
sxg_cert_url
は証明書チェーンを見つけるため、ブラウザで SXG を正しく読み込むために不可欠です。証明書チェーンには、cbor 形式の証明書と OCSP ステープリング情報が含まれています。同じオリジンからcert.cbor
ファイルを提供する必要はありません。HTTPS をサポートしている限り、CDN やその他の静的ファイル配信サービスを介して提供できます。sxg_validitiy_url
は、SXG 署名ヘッダー関連の情報を提供します。ページが最後の SXG 以降に変更されていない場合、技術的には SXG ファイル全体をダウンロードする必要はありません。そのため、署名ヘッダー情報を更新するだけで、ネットワーク トラフィックが減少すると予想されます。ただし、詳細はまだ実装されていません。
nginx
を開始すると、SXG をサービングできるようになります。
sudo systemctl start nginx.service
curl -H"Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
cat index.html.sxg
sxg1-b3...https://website.test/...(omit)
オプション 2: ソースからビルドされた nginx
モジュールを構成する
前述のステップ 3、オプション 2 を使用した場合は、次の手順を行います。
/opt/nginx
にインストールされた nginx
システムを、次の例に示すように構成します。
load_module "/opt/nginx/modules/ngx_http_sxg_filter_module.so";
events {
worker_connections 768;
}
http {
include mime.types;
default_type application/octet-stream;
add_header X-Content-Type-Options nosniff;
server {
listen 443 ssl;
ssl_certificate /path/to/ssl/fullchain.pem;
ssl_certificate_key /path/to/ssl/privkey.pem;
server_name example.com;
sxg on;
sxg_certificate /path/to/sxg/mySxg.pem;
sxg_certificate_key /path/to/sxg/mySxg.key;
sxg_cert_url https://website.test/certs/cert.cbor;
sxg_validity_url https://website.test/validity/resource.msg;
sxg_cert_path /certs/cert.cbor;
root /opt/nginx/html;
}
}
次に、nginx
を開始します。SXG を手に入れましょう!
cd /opt/nginx/sbin
sudo ./nginx
curl -H "Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
less index.html.sxg
sxg1-b3...https://website.test/...(omit)
ステップ 5: アプリケーション バックエンドを提供する
上記の例では、nginx
がルート ディレクトリで静的ファイルを提供しますが、nginx
がフロント HTTP(S) サーバーとして機能する限り、アプリケーションのアップストリーム ディレクティブを使用して、任意のウェブ アプリケーション バックエンド(Ruby on Rails、Django、Express など)の SXG を作成できます。
upstream app {
server 127.0.0.1:8080;
}
server {
location / {
proxy_pass http://app;
}
}
ステップ 6: テスト
dump-signedexchange ツールを使用して、提供される SXG が正しいことをテストし、エラーが報告されていないことを確認し、ヘッダーと本文が期待どおりであることを確認します。
go get -u github.com/WICG/webpackage/go/signedexchange/cmd/dump-signedexchange
export PATH=$PATH:~/go/bin
dump-signedexchange -verify -uri https://website.test/ | less
フィードバックの送信
SXG に取り組んでいる Chromium エンジニアは、webpackage-dev@chromium.org でフィードバックをお寄せください。 また、仕様に関するディスカッションに参加したり、チームにバグを報告したりすることもできます。 皆様からのフィードバックは、標準化プロセスや実装の問題の解決に大いに役立ちます。 ありがとうございました