使用 Signed Exchange 提供 AMP
Important: this documentation is not applicable to your currently selected format stories!
AMP 采用缓存和预加载等技术,除了格式之外,在速度方面也有诸多优势。这些优势也存在一些缺点,例如,嵌入到 AMP 查看工具内部时,会显示多余的网址。如果使用 Signed Exchange 来提供 AMP 内容,便可使用新的网络平台功能来克服所有这些缺点。
Signed Exchange 包含有效的 AMP 文档以及该内容的原始网址。此信息受数字签名保护,数字签名将文档与其声明的网址密切关联。这使得浏览器可以在网址栏中安全地显示原始网址,而不显示向浏览器传送字节的计算机的主机名。
除了(而不是取代)常规 AMP 内容外,还会传送签名的 AMP 内容。
Signed Exchange 是否适合我?
要实现 Signed Exchange,必须满足以下要求:
- 可以配置和控制服务器生成的 HTTP 标头(大部分纯基于网络的托管解决方案(例如 Blogger)都与 Signed Exchange 不兼容。)
- 可以采用多种方式生成 AMP Signed Exchange,例如,通过运行
amppackager
、作为 Go 二进制文件或者在 Docker 虚拟机中生成。 - 该打包器需要每六个星期更新一次。
- 可以在 HTTP 边缘服务器上改变
Accept
和AMP-Cache-Transform
标头,从而对同一个网址返回不同的内容。 - 运行
amppackager
的系统必须能够向以下项发出出站网络请求: - 颁发证书的证书授权机构
- 托管要签署的 AMP 文档的发布商服务器
- 用于获取当前 AMP 版本的
cdn.ampproject.org
- 在同一数据中心运行的所有
amppackager
实例之间共享的永久存储文件系统。
实现 Signed Exchange
为了在 AMP 文档上支持 Signed Exchange,建议遵守以下实现顺序。
获取受支持的 TLS 证书
要生成 Signed Exchange,需要具有 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"
确定要签署的网址
您需要创建一种网址格式,用于确定应当签署哪些文档。至关重要的是,不应当签署个性化信息等私人内容,以免发送误导性内容或错误内容。
出于性能考虑,应当仅向打包器传递有效的 AMP 文档作为输入。必要时,某些无效的 AMP 文档也可以接受,但应当避免通过打包器发送所有流量。
将打包器部署到临时服务器
首先,应当在临时服务器上设置 Signed Exchange,用于在迁移到生产环境之前先确认设置正确。
我们建议使用 amppackager
来生成 Signed Exchange。但是,如果该 Signed Exchange 不适合您的生产环境,您可以改用命令行客户端 transform
和 gen-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
。
测试
验证您的临时网站使用 MIME 类型 application/signed-exchange
(如果 HTTP 请求指定)内容做出响应。例如(将 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=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/html
、application/signed-exchange
还是其他内容):
$ curl -si https://staging.example.com/ | less
此输出必须包括以下行:
vary: Accept,AMP-Cache-Transform
将打包器部署到生产环境
安装
根据您的生产环境,调整上述临时部署步骤。
测试
使用命令行工具
运行与上述相同的测试。dump-signedexchange -verify
现在应该也会成功。
使用 Chrome
您也可以借助 ModHeader 扩展程序在 Chrome 中进行测试。从 Chrome 网上应用店中安装该扩展程序,并使用 google
的 Value
将 Request Headers
配置为 amp-cache-transform
。
请求 https://example.com/
后,您的服务器将传送 Signed Exchange,但其外观和行为应当与以前一样。您需要检查以确认 Signed Exchange 通过 DevTools 控制台正常返回。
在 Network
标签下,点击域名,并确认 Signed HTTP exchange
显示在 Preview
下方。
使用 Google AMP 缓存
确认 Signed Exchange 与 Google AMP 缓存兼容。这关系到是否可以在 Google 搜索等搜索引擎中发现它们。
要在 Google AMP 缓存中测试 Signed Exchange,请在 DevTools 中打开 Network 标签页,启用 Preserve log
,然后访问 https://example-com.cdn.ampproject.org/wp/s/example.com/
等网址。
如果请求成功,DevTools 将在 signed-exchange
行中显示 200
,并显示 from signed-exchange
行。
如果请求不成功,将缺少 signed-exchange 行,或者它们将被突出显示为红色。此外,可能还会显示 warning
标头,其中包含其他信息。
Google 搜索中的 Signed Exchange
如果您的 AMP 网页已成功作为 Signed Exchange 分发,它们的搜索结果将显示 AMP 闪电图标,这与以前相同,但点按这些结果将会在网址栏中显示 https://example.com
,而不是以 https://www.google.com/amp/….
开头的网址。此外,viewer
栏也不会显示。
在 DevTools 控制台的 network
标签页下,可以看到 signed-exchange
显示在 type
列下方。
Signed Exchange 服务发布商
下面列出了为 Signed Exchange 提供开箱即用支持的 CDN 和托管发布商。要想开始使用 Signed Exchange,最简单的方法是从中选择一个发布商:
- AMP Packager Google Cloud 点击即部署安装程序 AMP Packager 工具使用 Signed Exchange 为 AMP 提供支持,以此改进 AMP 网址。有关更多信息,请参阅 AMP 博客。
- Cloudflare AMP 真实网址。Cloudflare 是全球最大的网络之一。得益于 Cloudflare,企业、非盈利组织、博主以及任何使用互联网的人如今可以畅享更快、更安全的网站和应用。
-
Written by @CrystalOnScript