如何使用 nginx 設定 Signed HTTP Exchange (SXG)

如何產生具有 SXG 擴充功能的傳輸層安全標準 (TLS) 憑證、安裝用於產生 SXG 檔案的工具,以及設定 nginx 以提供 SXG 檔案。

Hiroki Kumazaki
Hiroki Kumazaki

Signed HTTP Exchanges (SXG) 是一項新的網路技術,可讓使用者更輕鬆地區分內容創作者和內容發布商。本指南說明如何設定 SXG。

跨瀏覽器支援

數種以 Chromium 為基礎的瀏覽器支援 SXG,包括 Google Chrome、Samsung Internet 和 Microsoft Edge。如需最新資訊,請參閱來源已簽署的 HTTP Exchange 的「共識與標準化」一節。

必要條件

如要在網站上導入 SXG,您必須:

  • 可以控管網域,包括 DNS 項目。
  • 取得憑證。SXG 需要核發專屬憑證。具體來說,您無法重複使用 TLS 金鑰或憑證。
  • 具備可透過 HTTPS 產生並提供 SXG 的 HTTP 伺服器。

假設

本指南假設您:

  • 擁有 OpenSSL 1.1.1 環境。本指南是針對 amd64 ISA 的 Ubuntu 18.04 LTS 編寫而成,
  • 能執行 sudo 來安裝執行檔。
  • 使用 nginx 做為 HTTP 伺服器。
  • 目前使用 DigiCert 產生包含 SXG 相關擴充功能的憑證,因為目前是唯一支援這些擴充功能的提供者。

此外,本文的範例指令假設您的網域是 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 天。
  • 已啟用「Include the CanSignHttpExchanges 擴充功能至憑證」核取方塊 (位於「Additional Certificate Options」底下)。
勾選「在憑證中納入 CanSignHttpExchanges 擴充功能」核取方塊。

如果您的憑證與上述條件不符,瀏覽器和發布商會基於安全考量拒絕您的 SXG。 本指南假設您從 DigiCert 取得的憑證檔案名稱為 mySxg.pem

步驟 2:安裝「libsxg

在不使用工具的情況下,SXG 格式相當複雜且難以產生。您可以使用下列其中一個選項產生 SXG:

本指南使用 libsxg

選項 1:透過 Debian 套件安裝 libsxg

只要 OpenSSL (libssl-dev) 版本相符,您就可以照常安裝套件。

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。基於先決條件,您需要安裝 gitcmakeopensslgcc

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 之前動態產生 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:設定 nginx 外掛程式以與 SXG 搭配使用

選項 1:設定 install-from-Debian nginx 模組

如果先前使用步驟 3 (方法 1),請按照下列指示操作。

提交 SXG 內容需要 HTTPS。您可以透過 DigiCert、Let's Encrypt 及其他服務取得 SSL/TLS 憑證。請注意,您「不能」將 SXG 憑證用於 SSL,反之亦然,所以您需要兩個憑證。您應該將 SSL 金鑰/憑證組合放入 /path/to/ssl//path/to/sxg/ 中的 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-signature-header 相關的資訊。如果網頁自上次 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 提供根目錄中的靜態檔案,但您可以為應用程式使用上游指令,為任意網頁應用程式後端 (例如 Ruby on Rails、Django 或 Express) 建立 SXG,前提是您的 nginx 可以做為前端 HTTP(S) 伺服器。

upstream app {
    server 127.0.0.1:8080;
}

server {
    location / {
        proxy_pass http://app;
    }
}

步驟 6:測試

使用傾印簽章工具測試提供的 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 分享寶貴意見。 您也可以參與規格討論,或向團隊回報錯誤。您的寶貴意見不僅有助於我們完成標準化程序,也有助於解決導入問題。 感謝!