使用簽名交換提供 AMP
AMP 透過快取和預先載入等技術,提供超越格式本身的速度優勢。這些優勢可能會帶來缺點,例如當嵌入 AMP Viewer 中時,會顯示額外的 URL。透過使用簽名交換提供 AMP 內容,您可以使用新的網路平台功能來克服所有這些問題。
簽名交換是由有效的 AMP 文件和內容的原始 URL 組成。此資訊受到數位簽章的保護,數位簽章安全地將文件連結到其聲稱的 URL。這使瀏覽器能夠安全地在 URL 列中顯示原始 URL,而不是將位元組傳遞到瀏覽器的機器的hostname (主機名稱)。
簽名的 AMP 內容是除了 (而不是取代) 常規 AMP 內容之外提供的。
簽名交換適用於我嗎?
若要實作簽名交換,您必須滿足以下需求
- 能夠設定和控制您的伺服器產生的 HTTP 標頭。(大多數純粹基於網路的託管解決方案,例如 Blogger,不與簽名交換相容。)
- 能夠產生 AMP 簽名交換,例如執行
amppackager
,作為 Go 二進位檔,或在 Docker VM 中。 - 封裝工具需要每六週更新一次。
- 能夠在邊緣 HTTP 伺服器上 Vary
Accept
和AMP-Cache-Transform
標頭,為相同的 URL 傳回不同的內容。 - 執行
amppackager
的系統需要能夠對以下項目發出外送網路請求 - 頒發您的憑證的憑證授權單位
- 託管要簽署的 AMP 文件的發佈者伺服器
cdn.ampproject.org
以取得當前版本的 AMP- 在同一資料中心中運行的所有
amppackager
實例之間,需要一個持久的共用儲存檔案系統。
實作簽名交換
以下是建議的實作順序,以支援您的 AMP 文件上的簽名交換。
取得支援的 TLS 憑證
若要產生簽名交換,您需要具有 CanSignHttpExchanges
擴充功能的 TLS 憑證。截至 2019 年 4 月,DigiCert 是此擴充功能的唯一供應商 (更多資訊)。
為了產生憑證,憑證授權單位 (CA) 將需要憑證簽署請求 (CSR),這可以由 openssl
產生。ampbyexample.com
的 CSR 範例
# generate private key (if necessary)
$ openssl ecparam -out ampbyexample-packager.key -name prime256v1 -genkey
# generate CSR (the file ampbyexample-packager.csr)
$ openssl req -new -key ampbyexample-packager.key -nodes -out ampbyexample-packager.csr -subj "/C=US/ST=California/L=Mountain View/O=Google LLC/CN=ampbyexample.com"
判斷哪些 URL 將被簽署
您將需要建立一個 URL 模式,定義應簽署哪些文件。私人內容 (例如個人化資訊) 不應簽署,以避免傳送誤導性或不正確的內容,這一點至關重要。
為了效能考量,封裝工具應僅傳遞有效的 AMP 文件作為輸入。如果需要,一些無效的 AMP 文件也可以,但您應避免將所有流量都透過封裝工具傳送。
將封裝工具部署到預備伺服器
您應首先在預備伺服器上設定簽名交換,以驗證您的設定是否正確,然後再遷移到正式環境。
我們建議使用 amppackager
來產生簽名交換。但是,如果這不適合您的正式環境,您可以改用命令列用戶端 transform
和 gen-signedexchange
,並自行處理內容協商和憑證管理任務。
以下指示適用於使用 amppackager
的部署。
設定
amppackager
的設定檔 (amppkg.toml
) 要求 CertFile 和 KeyFile。
KeyFile 是私密金鑰 (以上範例中的 ampbyexample-packager.key
),它應具有以下格式。(注意:不要分享您自己的私密金鑰,並保護它免於意外分享!)
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEINDgf1gprbdD6hM1ttmRC9+tOqJ+lNRtHwZahJIXfLADoAoGCCqGSM49
…
4j1NY29jVmAMQYrBYb+6heiv6ok+8c/zJQ==
-----END EC PRIVATE KEY-----
CertFile 是公開憑證。如果 DigiCert 提供了憑證,則可以透過將 DigiCert 提供的特定於原始伺服器的憑證和 DigiCertCA.crt
檔案串連在一起來建立此憑證。
-----BEGIN CERTIFICATE-----
MIIE0zCCBFmgAwIBAgIQCkEgeFknZluZtdcJnvdFCjAKBggqhkjOPQQDAjBMMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSYwJAYDVQQDEx1EaWdp
Q2VydCBFQ0MgU2VjdXJlIFNlcnZlciBDQTAeFw0xODEwMzAwMDAwMDBaFw0xOTEx
MDYxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJjYTEWMBQGA1UEBxMN
TW91bnRhaW4gVmlldzETMBEGA1UEChMKR29vZ2xlIExMQzEZMBcGA1UEAxMQYW1w
YnlleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABAGu0CjzWa6i
…
PXLGRK8i0lr7Jv6ZKPY8tfaB/c5yK404QU4HNggmAiEAlnNjIerjJOLHb8CvVaUQ
nhhn0a35nHp1yvE651W14fMwCgYIKoZIzj0EAwIDaAAwZQIwI4/7dpqJQxkQwpP3
DAjVOFdjC6PDcUIRPll3bF0srrTUXSyZ8xkM4q/RhB51A0hVAjEAsUGNYBje9RIO
wf9qyV2iHB+9cBwgKfC0KvEcBugbgHShypM8hPhV9UMC3qTpdKPx
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDrDCCApSgAwIBAgIQCssoukZe5TkIdnRw883GEjANBgkqhkiG9w0BAQwFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaMEwxCzAJBgNVBAYTAlVT
…
loB5hWp2Jp2VDCADjT7ueihlZGak2YPqmXTNbk19HOuNssWvFhtOyPNV6og4ETQd
Ea8/B6hPatJ0ES8q/HO3X8IVQwVs1n3aAr0im0/T+Xc=
-----END CERTIFICATE-----
安裝
測試
驗證您的預備網站在使用 HTTP 請求指定時,是否以 MIME 類型 application/signed-exchange
回應內容。例如 (將 staging.example.com
替換為您的預備伺服器)
$ curl -si -H 'amp-cache-transform: google;v="1..100"' -H 'accept: application/signed-exchange;v=b3;q=0.9,*/*;q=0.8' https://staging.example.com/ | less
輸出必須包含此行
content-type: application/signed-exchange;v=b3
v=b3
版本字串是截至 2019 年 8 月的版本。此版本將會變更。回應的大部分應為您的 AMP 頁面 (純文字)。有一個小的二進位標頭,並且如果頁面大於 16kb,則會散佈一些二進位位元組。
dump-signedexchange
工具可用於檢查回應
$ curl -s --output - -H 'amp-cache-transform: google;v="1..100"' -H 'accept: application/signed-exchange;v=b3;q=0.9,*/*;q=0.8' https://staging.example.com/ > example.sxg
$ dump-signedexchange -i example.sxg
format version: 1b3
(請注意,-verify
開關在此時將無法運作,因為所需的憑證不在 https://example.com/
伺服器上。)
驗證回應始終包含 Vary
標頭,其值為 Accept,AMP-Cache-Transform
(無論 MIME 類型是 text/html
、application/signed-exchange
還是其他類型)
$ curl -si https://staging.example.com/ | less
此輸出必須包含此行
vary: Accept,AMP-Cache-Transform
將封裝工具部署到正式環境
安裝
根據您的正式環境調整上述預備部署步驟。
測試
使用命令列工具
執行與上述相同的測試。dump-signedexchange -verify
現在也應成功。
使用 Chrome
您也可以在 Chrome 中使用 ModHeader 擴充功能進行測試。從 Chrome Webstore 安裝它,並將 Request Headers
設定為 amp-cache-transform
,Value
為 google
。
在請求 https://example.com/
後,您的伺服器將傳遞簽名交換,但它應看起來和行為與之前相同。您需要檢查是否透過 DevTools 主控台正確傳回了簽名交換。
在 Network
標籤下,按一下您的網域名稱,並檢查 Preview
下是否出現 Signed HTTP exchange
。
使用 Google AMP 快取
確認簽名交換與 Google AMP 快取相容。這與它們在 Google 搜尋等搜尋引擎上的可探索性有關。
若要在 Google AMP 快取中測試簽名交換,請開啟 DevTools 中的網路標籤,啟用 Preserve log
,並造訪 URL,例如 https://example-com.cdn.ampproject.org/wp/s/example.com/
。
如果請求成功,DevTools 將顯示 200
,其中包含 signed-exchange
列和 from signed-exchange
列。
如果不成功,簽名交換列將會遺失,或者它們會以紅色突出顯示。也可能存在 warning
標頭,提供其他資訊。
Google 搜尋中的簽名交換
如果您的 AMP 頁面已成功作為簽名交換發佈,則其搜尋結果將顯示 AMP 閃電符號,與之前相同,但點擊結果將在 URL 列中顯示 https://example.com
,而不是以 https://www.google.com/amp/….
開頭的 URL。此外,viewer
列將不會出現。
在 DevTools 主控台中,在 network
標籤下,您將能夠在 type
欄位下看到 signed-exchange
。
簽名交換服務供應商
以下是提供簽名交換開箱即用支援的 CDN 和託管供應商列表。使用其中一個是開始使用簽名交換的最簡單方法
- AMP Packager Google Cloud 一鍵部署安裝程式 AMP Packager 是一種透過使用簽名交換提供 AMP 來改進 AMP URL 的工具。在 AMP 部落格中閱讀更多資訊。
- Cloudflare AMP Real URL。 Cloudflare 是世界上最大的網路之一。如今,企業、非營利組織、部落客以及任何在網路上存在的人,都因 Cloudflare 而擁有更快、更安全的網站和應用程式。
-
由 @CrystalOnScript 撰寫