瞭解如何使用 Web Packager 放送 Signed Exchange (SXG)。
已簽署的交換 (SXG) 是一種提交機制,可驗證資源的來源,不受其提交方式影響。以下說明如何使用 Web Packager 設定 Signed Exchange。我們會提供自行簽署和 CanSignHttpExchanges 憑證的操作說明。
使用自行簽署的憑證服務 SXG
使用自行簽署的憑證提供 SXG 主要用於示範和測試。使用自行簽署憑證簽署的 SXG,如果在測試環境以外使用,會在瀏覽器中產生錯誤訊息,因此不應提供給檢索器。
必要條件
如要按照這些操作說明操作,您必須在開發環境中安裝 openssl 和 Go。
產生自行簽署的憑證
本節說明如何產生可與已簽署交換機制搭配使用的自簽憑證。
操作說明
產生私密金鑰。
openssl ecparam -out priv.key -name prime256v1 -genkey私密金鑰會儲存為名為
priv.key的檔案。建立憑證簽署要求 (CSR)。
openssl req -new -sha256 -key priv.key -out cert.csr -subj '/O=Web Packager Demo/CN=example.com'憑證簽署要求是一段經過編碼的文字,用於傳達向憑證授權單位(CA) 要求憑證所需的必要資訊。雖然您不會向 CA 要求憑證,但仍需要建立憑證簽署要求。
上述指令會為名為
Web Packager Demo的機構建立憑證簽署要求,該機構的一般名稱為example.com。通用名稱應為網站的完整網域名稱,該網站包含您要以 SXG 封裝的內容。在實際的 SXG 設定中,這會是您擁有的網站。不過,在本操作說明所述的測試環境中,可以是任何網站。
建立具有
CanSignHttpExchanges擴充功能的憑證。openssl x509 -req -days 90 -in cert.csr -signkey priv.key -out cert.pem -extfile <(echo -e "1.3.6.1.4.1.11129.2.1.22 = ASN1:NULL\nsubjectAltName=DNS:example.com")這個指令會使用在步驟 1 和 2 中建立的私密金鑰和 CSR,建立憑證檔案
cert.pem。-extfile旗標會將憑證與CanSignHttpExchanges憑證擴充資料建立關聯 (1.3.6.1.4.1.11129.2.1.22是CanSignHttpExchanges擴充資料的物件 ID)。此外,-extfile旗標也會將example.com定義為主體別名。如果您想知道
cert.pem的內容,可以使用下列指令查看:openssl x509 -in cert.pem -noout -text您已完成私密金鑰和憑證的建立程序。您將在下一節中需要
priv.key和cert.pem檔案。
設定 Web Packager 伺服器以進行測試
必要條件
安裝 Web Packager。
git clone https://github.com/google/webpackager.git建構
webpkgserver。cd webpackager/cmd/webpkgserver go build .webpkgserver是 Web Packager 專案中的特定二進位檔。確認已正確安裝
webpkgserver。./webpkgserver --help這個指令應傳回
webpkgserver的使用情形資訊。如果這麼做無法解決問題,建議您先確認 GOPATH 是否已正確設定。
操作說明
前往
webpkgserver目錄 (您可能已在這個目錄中)。cd /path/to/cmd/webpkgserver複製範例來建立
webpkgsever.toml檔案。cp ./webpkgserver.example.toml ./webpkgserver.toml這個檔案包含
webpkgserver的設定選項。使用您選擇的編輯器開啟
webpkgserver.toml,然後進行下列變更:- 將
#AllowTestCert = false行變更為AllowTestCert = true。 - 變更
PEMFile = 'path/to/your.pem'這一行,以反映您建立的 PEM 憑證cert.pem的路徑。請勿變更提及TLS.PEMFile的程式碼行,這是不同的設定選項。 - 變更
KeyFile = 'priv.key'這一行,反映您建立的私密金鑰priv.key的路徑。請勿變更提及TLS.KeyFile的行,這是不同的設定選項。 - 將
#CertURLBase = '/webpkg/cert'行變更為CertURLBase = 'data:'。CertURLBase表示 SXG 憑證的放送位置。這項資訊可用於在 SXG 的Signature標頭中設定cert-url參數。在正式環境中,CertURLBase的用法如下:CertURLBase = 'https://mysite.com/'。不過,如果是本機測試,您可以使用CertURLBase = 'data:'指示webpkgserver使用資料網址,將憑證內嵌在cert-url欄位中。對於本機測試,這是提供 SXG 憑證最方便的方式。 - 變更
Domain = 'example.org'這行,以反映您為其建立憑證的網域。如果您確實按照本文的說明操作,這個值應會變更為example.com。webpkgserver只會擷取webpkgserver.toml所指明網域的內容。如果您嘗試從其他網域擷取網頁,但未更新webpkgserver.toml,webpkgserver記錄會顯示錯誤訊息URL doesn't match the fetch targets。
選用
如果您想啟用或停用子資源預先載入功能,請參考下列
webpkgserver.toml設定選項:如要讓
webpkgserver插入指令,以便預先載入樣式表和指令碼子資源做為 SXG,請將#PreloadCSS = false行變更為PreloadCSS = true。此外,請將#PreloadJS = false行變更為PreloadJS = true。除了使用這項設定選項,您也可以手動將
Link: rel="preload"標頭和<link rel="preload">代碼加入網頁的 HTML。根據預設,
webpkgserver會將現有的<link rel="preload">標記替換為等效的<link>標記,以便擷取這項內容做為 SXG。在這種情況下,webpkgserver會視需要設定allowed-alt-sxg和header-integrity指令,HTML 作者不必手動新增這些指令。如要覆寫這項行為並保留現有的非 SXG 預先載入內容,請將#KeepNonSXGPreloads (default = false)變更為KeepNonSXGPreloads = true。請注意,啟用這個選項可能會導致 SXG 不符合這些規定,無法使用 Google SXG 快取。
- 將
開始進行
webpkgserver。./webpkgserver如果伺服器已成功啟動,您應該會看到下列記錄訊息:
shell Listening at 127.0.0.1:8080 Successfully retrieved valid OCSP. Writing to cache in /private/tmp/webpkg您的記錄訊息可能會略有不同。具體來說,
webpkgserver用於快取憑證的目錄會因作業系統而異。如果沒有看到這些訊息,建議您先檢查
webpkgserver.toml。如果您更新
webpkgserver.toml,請重新啟動webpkgserver。請使用下列指令啟動 Chrome:
shell /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --user-data-dir=/tmp/udd \ --ignore-certificate-errors-spki-list=`openssl x509 -noout -pubkey -in cert.pem | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64`這個指令會指示 Chrome 忽略與
cert.pem相關聯的憑證錯誤。這樣一來,您就能使用測試憑證測試 SXG。如果未使用這項指令啟動 Chrome,在開發人員工具中檢查 SXG 時,系統會顯示錯誤Certificate verification error: ERR_CERT_INVALID。注意:
您可能需要調整這項指令,以反映您電腦上的 Chrome 位置,以及
cert.pem的位置。如果您已正確完成這項操作,網址列下方應會顯示警告。警告應類似於以下內容:You are using an unsupported command-line flag: --ignore-certificate-errors-spki-list=9uxADcgc6/ho0mJLRMBcOjfBaN21k0sOInoMchr9CMY=.如果警告未包含雜湊字串,表示您未正確指出 SXG 憑證的位置。
開啟開發人員工具的「網路」分頁,然後前往下列網址:
http://localhost:8080/priv/doc/https://example.com。這會向
http://localhost:8080執行的webpackager例項提出要求,要求包含https://example.com內容的 SXG。/priv/doc/是webpackager使用的預設 API 端點。
Network 分頁會列出下列資源:
- 類型為
signed-exchange的資源。這是 SXG。 - 類型為
cert-chain+cbor的資源。這是 SXG 憑證。SXG 憑證必須使用application/cert-chain+cbor格式。 - 類型為
document的資源。這是透過 SXG 提供的內容。
如果您沒有看到這些資源,請嘗試清除瀏覽器快取,然後重新載入
http://localhost:8080/priv/doc/https://example.com。按一下「Preview」分頁標籤,即可進一步瞭解已簽署的 Exchange 和其簽章。

- 類型為
使用 CanSignHttpExchanges 憑證放送已簽署的交換機制
本節的操作說明說明如何使用 CanSignHttpExchanges 憑證放送 SXG。如要將 SXG 用於正式版,就必須取得 CanSignHttpExchanges 憑證。
為了簡化說明,我們假設您已瞭解「使用自簽憑證設定已簽署的交易」一節中討論的概念,因此本節的說明會以此為前提。
必要條件
您擁有
CanSignHttpExchanges憑證,這個頁面列出提供這類憑證的 CA。如果您沒有憑證,可以將 webpkgserver 設為自動從 CA 擷取憑證。您可以按照這個頁面中的說明,瞭解
webpkgserver.toml的內容。雖然不是必要步驟,但我們強烈建議您在邊緣伺服器後方執行
webpkgserver。如果您不使用邊緣伺服器,就必須在webpkgserver.toml中設定TLS.PEMFile和TLS.KeyFile選項。根據預設,webpkgserver會透過 HTTP 執行。不過,瀏覽器必須透過 HTTPS 提供 SXG 憑證,才能視為有效。設定TLS.PEMFile和TLS.KeyFile後,webpkgserver就能使用 HTTPS,並直接將 SXG 憑證提供給瀏覽器。
操作說明
將網站的 SXG 憑證連結後,再連結網站的 CA 憑證,即可建立 PEM 檔案。如需更多操作說明,請參閱本文。
PEM 是一種檔案格式,通常用作儲存多個憑證的「容器」。
複製範例,建立新的
webpkgsever.toml檔案。cp ./webpkgserver.example.toml ./webpkgserver.toml使用您選擇的編輯器開啟
webpkgserver.toml,然後進行下列變更:- 變更
PEMFile = cert.pem這行指令,反映包含完整憑證鏈結的 PEM 檔案位置。 - 變更
KeyFile = 'priv.key'這行,以反映 PEM 檔案對應的私密金鑰位置。 - 變更
Domain = 'example.org'這一行,以反映您的網站。 - (選用) 如要讓
webpkgserver每 90 天 (Google 為 45 天) 自動續約 SXG 憑證,請在webpkgserver.toml的[SXG.ACME]部分設定選項。這個選項僅適用於已設定 DigiCert 或 Google ACME 帳戶的網站。
- 變更
設定邊緣伺服器,將流量轉送至
webpkgserver執行個體。webpkgserver處理的要求主要分為兩種:SXG 要求 (由/priv/doc/端點提供) 和 SXG 憑證要求 (由/webpkg/cert/端點提供)。每種要求類型的網址重寫規則略有不同。詳情請參閱「在前端邊緣伺服器後方執行」。注意:
根據預設,
webpkgserver會在/webpkg/cert/$CERT_HASH中提供 SXG 憑證,例如/webpkg/cert/-0QmE0gvoedn92gtwI3s7On9zPevJGm5pn2RYhpZxgY。如要產生$CERT_HASH,請執行下列指令:shell openssl base64 -in cert.pem -d | openssl dgst -sha256 -binary | base64 | tr /+ _- | tr -d =