AMP

使用签名交换提供 AMP

重要提示:此文档不适用于您当前选择的格式 email

AMP 通过缓存和预加载等技术提供了超越格式的速度优势。当嵌入在 AMP 查看器中时,这些优势可能会带来诸如显示额外 URL 的缺点。通过使用签名交换提供 AMP 内容,您可以使用新的 Web 平台功能来克服所有这些问题。

签名交换由有效的 AMP 文档和内容的原始 URL 组成。此信息受数字签名保护,该签名将文档安全地与其声明的 URL 绑定。这使浏览器可以安全地在 URL 栏中显示原始 URL,而不是将字节传递给浏览器的计算机的主机名。

签名的 AMP 内容是除了(而不是代替)常规 AMP 内容交付的。

此功能目前在 Chrome 上受支持,但计划在其他浏览器上实现。

签名交换适用于我吗?

要实现签名交换,您必须满足以下要求

  • 能够配置和控制服务器生成的 HTTP 标头。(大多数纯粹基于 Web 的托管解决方案(例如 Blogger)与签名交换兼容。)
  • 能够生成 AMP 签名交换,例如通过运行 amppackager 作为 Go 二进制文件或在 Docker VM 中运行。
  • 打包程序需要每六周更新一次。
  • 能够 Vary 边缘 HTTP 服务器上的 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

有关您需要进行的服务器端更改(将所需的请求路由到 amppkg)的示例,请参见packager.js(由 amp.dev 使用)。

测试

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

您也可以借助 ModHeader 扩展程序在 Chrome 中进行测试。从 Chrome Webstore 安装它,并将 Request Headers 配置为 amp-cache-transform,其 Valuegoogle

在请求 https://example.com/ 之后,您的服务器将交付签名交换,但它应该看起来和以前一样。您需要检查是否通过DevTools 控制台正确返回签名交换。

Network 选项卡下,单击您的域名,并检查 Signed HTTP exchange 是否出现在 Preview 下。

使用 Google AMP 缓存

确认签名交换与 Google AMP 缓存兼容。这与它们在 Google 搜索等搜索引擎上的可发现性有关。

要在 Google AMP 缓存中测试签名交换,请在 DevTools 中打开网络选项卡,启用 Preserve log,然后访问诸如 https://example-com.cdn.ampproject.org/wp/s/example.com/ 之类的 URL。

如果请求成功,开发者工具 (DevTools) 将会显示一个带有 signed-exchange 行和一个 from signed-exchange 行的 200 状态码。

如果请求不成功,则会缺少 signed-exchange 行,或者这些行会以红色高亮显示。 还可能存在提供额外信息的 warning 标头。

如果您的 AMP 页面已成功作为签名交换分发,它们的搜索结果将显示 AMP 闪电标志,与之前相同,但点击结果将在 URL 栏中显示 https://example.com,而不是以 https://www.google.com/amp/…. 开头的 URL。此外,viewer 工具栏不会出现。

在 DevTools 控制台的 network 选项卡下,您可以在 type 列中看到 signed-exchange

签名交换服务提供商

以下是提供开箱即用签名交换支持的 CDN 和托管提供商列表。 使用其中一个是最容易上手签名交换的方法。