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 请求指定时,您的暂存站点是否使用 application/signed-exchange MIME 类型响应内容。例如(将 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 开关此时将不起作用。)

验证响应是否始终包含值为 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

您还可以在 Chrome 中借助 ModHeader 扩展程序进行测试。从 Chrome Webstore 安装该扩展程序,并将 Request Headers 配置为 amp-cache-transform,并使用值为 google

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

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

使用 Google AMP 缓存

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

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

如果请求成功,开发者工具将显示带有 signed-exchange 行的 200,以及 from signed-exchange 行。

如果请求不成功,则签名交换行将丢失,或者它们将以红色突出显示。还可能存在 warning 标头,其中提供其他信息。

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

在开发者工具控制台的“network”选项卡下,您将能够在“type”列下看到“signed-exchange”。

签名交换服务提供商

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