AMP

使用簽名交換提供 AMP

重要事項:此文件不適用於您目前選取的格式 stories

AMP 除了格式之外,還透過快取和預先載入等技術提供速度優勢。這些優勢可能會產生缺點,例如在嵌入 AMP 檢視器內時,會顯示額外的網址。透過使用簽名交換提供 AMP 內容,您可以使用新的網路平台功能來克服所有這些缺點。

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

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

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

簽名交換適用於我嗎?

若要實作簽名交換,您必須符合下列需求

  • 能夠設定和控制伺服器產生的 HTTP 標頭。(大多數純粹以網路為基礎的託管解決方案 (例如 Blogger) 與簽名交換相容。)
  • 產生 AMP 簽名交換的能力,例如執行 amppackager,作為 Go 二進位檔,或在 Docker VM 內執行。
  • packager 需要每六週更新一次。
  • 在邊緣 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 模式,以定義應簽署哪些文件。務必不要簽署私人內容 (例如個人化資訊),以避免傳送誤導或不正確的內容。

為了效能考量,packager 應僅傳遞有效的 AMP 文件作為輸入。如果需要,某些無效的 AMP 文件也沒問題,但您應避免透過 packager 傳送所有流量。

將 packager 部署到預備伺服器

您應先在預備伺服器上設定簽名交換,以確認您的設定正確,然後再移轉到正式環境。

我們建議使用 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

將 packager 部署到正式環境

安裝

視您的正式環境而定,調整上述預備部署步驟。

測試

使用命令列工具

執行與上述相同的測試。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 Cache

確認簽名交換與 Google AMP 快取相容。這與它們在 Google 搜尋等搜尋引擎上的可探索性有關。

若要在 Google AMP 快取中測試簽名交換,請開啟 DevTools 中的 [network] 索引標籤,啟用 [Preserve log],並造訪類似 https://example-com.cdn.ampproject.org/wp/s/example.com/ 的 URL。

如果要求成功,DevTools 將顯示 200 以及 signed-exchange 列,以及 from signed-exchange 列。

如果不成功,則會遺失 signed-exchange 列,或它們會以紅色醒目提示。也可能存在提供其他資訊的 warning 標頭。

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

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

簽名交換服務供應商

以下是提供簽名交換開箱即用支援的 CDN 和託管供應商清單。使用其中一種是最容易開始使用簽名交換的方式