AMP

使用签名交换服务 AMP

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

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

签名 AMP 内容除了(而不是替代)常规 AMP 内容之外进行传递。

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

签名交换适合我吗?

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

  • 能够配置和控制您的服务器生成的 HTTP 标头。(大多数纯粹的基于 Web 的托管解决方案(例如 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/ 服务器上。)

验证响应是否始终包括值为 Accept,AMP-Cache-TransformVary 标头(无论 MIME 类型是 text/htmlapplication/signed-exchange 还是其他类型)

$ curl -si https://staging.example.com/ | less

此输出必须包含此行

vary: Accept,AMP-Cache-Transform

将打包器部署到生产环境

安装

根据您的生产环境,调整上述暂存部署步骤。

测试

使用命令行工具

运行与上述相同的测试。dump-signedexchange -verify 现在也应成功。

使用 Chrome

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

请求 https://example.com/ 后,您的服务器将传递一个签名交换,但它应看起来和之前的行为相同。您需要检查是否通过开发者工具控制台正确返回了签名交换。

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

使用 Google AMP 缓存

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

要在 Google AMP 缓存中测试签名交换,请在开发者工具中打开网络选项卡,启用 Preserve log,然后访问一个 URL,例如 https://example-com.cdn.ampproject.org/wp/s/example.com/

如果请求成功,开发者工具将显示 200,其中包含 signed-exchange 行和 from signed-exchange 行。

如果不成功,则会缺少签名交换行,或者会突出显示为红色。可能还会存在提供其他信息的 warning 标头。

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

在开发者工具控制台中,在 network 选项卡下,您将可以在 type 列下看到 signed-exchange

签名交换服务提供商

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