AMP

使用簽名交換提供 AMP

AMP 透過快取和預先載入等技術,提供超越格式本身的速度優勢。這些優勢可能會帶來缺點,例如當嵌入 AMP Viewer 中時,會顯示額外的 URL。透過使用簽名交換提供 AMP 內容,您可以使用新的網路平台功能來克服所有這些問題。

簽名交換是由有效的 AMP 文件和內容的原始 URL 組成。此資訊受到數位簽章的保護,數位簽章安全地將文件連結到其聲稱的 URL。這使瀏覽器能夠安全地在 URL 列中顯示原始 URL,而不是將位元組傳遞到瀏覽器的機器的hostname (主機名稱)。

簽名的 AMP 內容是除了 (而不是取代) 常規 AMP 內容之外提供的。

此功能目前在 Chrome 上受到支援,但計劃在其他瀏覽器上實作。

簽名交換適用於我嗎?

若要實作簽名交換,您必須滿足以下需求

  • 能夠設定和控制您的伺服器產生的 HTTP 標頭。(大多數純粹基於網路的託管解決方案,例如 Blogger,與簽名交換相容。)
  • 能夠產生 AMP 簽名交換,例如執行 amppackager,作為 Go 二進位檔,或在 Docker VM 中。
  • 封裝工具需要每六週更新一次。
  • 能夠在邊緣 HTTP 伺服器上 Vary AcceptAMP-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 來產生簽名交換。但是,如果這不適合您的正式環境,您可以改用命令列用戶端 transformgen-signedexchange,並自行處理內容協商和憑證管理任務。

以下指示適用於使用 amppackager 的部署。

設定

amppackager 的設定檔 (amppkg.toml) 要求 CertFileKeyFile

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-----

安裝

依照 此處的指示設定您網站的 amppackager

請參閱 packager.js (由 amp.dev 使用) 以取得伺服器端變更的範例,您需要進行這些變更才能將必要的請求路由到 amppkg

測試

驗證您的預備網站在使用 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="1..100" 是一個佔位符。不要與此確切值比對;相反地,如 amppackager 安裝指示中所述,僅檢查 amp-cache-transform 標頭是否存在,並忽略該值。

回應中的 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/htmlapplication/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-transformValuegoogle

在請求 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 標頭,提供其他資訊。

如果您的 AMP 頁面已成功作為簽名交換發佈,則其搜尋結果將顯示 AMP 閃電符號,與之前相同,但點擊結果將在 URL 列中顯示 https://example.com,而不是以 https://www.google.com/amp/…. 開頭的 URL。此外,viewer 列將不會出現。

在 DevTools 主控台中,在 network 標籤下,您將能夠在 type 欄位下看到 signed-exchange

簽名交換服務供應商

以下是提供簽名交換開箱即用支援的 CDN 和託管供應商列表。使用其中一個是開始使用簽名交換的最簡單方法