瞭解如何使用 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 =