AMP

使用签名交换提供 AMP

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

签名交换 由有效的 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) 需要一个 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-----

安装

按照 此处 的说明为你的网站设置 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

您还可以借助 ModHeader 扩展程序 在 Chrome 中进行测试。从 Chrome 网上应用店安装它,并将 请求标头 配置为 amp-cache-transformgoogle

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

网络 选项卡下,点击您的域名,并检查 预览 下是否显示 已签名的 HTTP 交换

使用 Google AMP 缓存

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

要在 Google AMP 缓存中测试已签名的交换,请在 DevTools 中打开网络选项卡,启用 保留日志,并访问一个 URL,例如 https://example-com.cdn.ampproject.org/wp/s/example.com/

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

如果失败,则 signed-exchange 行将缺失,或者它们将以红色突出显示。还可能存在 警告 标头,提供其他信息。

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

在 DevTools 控制台中,在 网络 选项卡下,您将能够在 类型 列下看到 signed-exchange

签名交换服务提供商

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