如何產生具有 SXG 擴充功能的傳輸層安全標準 (TLS) 憑證、安裝用於產生 SXG 檔案的工具,以及設定 nginx 以提供 SXG 檔案。
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」底下)。
如果您的憑證與上述條件不符,瀏覽器和發布商會基於安全考量拒絕您的 SXG。
本指南假設您從 DigiCert 取得的憑證檔案名稱為 mySxg.pem
。
步驟 2:安裝「libsxg
」
在不使用工具的情況下,SXG 格式相當複雜且難以產生。您可以使用下列其中一個選項產生 SXG:
- 以 Go 編寫的 gen-signedexchange 工具。
- 以 C 編寫的
libsxg
程式庫。
本指南使用 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
。基於先決條件,您需要安裝 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 之前動態產生 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 分享寶貴意見。 您也可以參與規格討論,或向團隊回報錯誤。您的寶貴意見不僅有助於我們完成標準化程序,也有助於解決導入問題。 感謝!