AMP

使用签名交换提供 AMP

重要提示:本篇文档不适用于您当前选择的格式故事

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

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

提供的签名 AMP 内容是除了(而不是替代)常规 AMP 内容之外的。

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

签名交换是否适合我?

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

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

(请注意,由于所需的证书不在 https://example.com/ 服务器上,因此 -verify 开关此时将不起作用。)

验证响应是否始终包含 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,并访问诸如 https://example-com.cdn.ampproject.org/wp/s/example.com/ 之类的 URL。

如果请求成功,DevTools 将显示带有 signed-exchange 行的 200,以及 from signed-exchange 行。

如果失败,签名交换行将缺失,或者它们将被突出显示为红色。还可能存在提供其他信息的 warning 标头。

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

在 DevTools 控制台中,在 network 选项卡下,您将能够在 type 列下看到 signed-exchange

签名交换服务提供商

以下是提供对签名交换的开箱即用支持的 CDN 和托管提供商的列表。使用其中一种是开始使用签名交换的最简单方法