使用签名交换提供 AMP
重要提示:此文档不适用于您当前选择的格式 email!
AMP 通过缓存和预加载等技术提供了超越格式的速度优势。当嵌入在 AMP 查看器中时,这些优势可能会带来诸如显示额外 URL 的缺点。通过使用签名交换提供 AMP 内容,您可以使用新的 Web 平台功能来克服所有这些问题。
签名交换由有效的 AMP 文档和内容的原始 URL 组成。此信息受数字签名保护,该签名将文档安全地与其声明的 URL 绑定。这使浏览器可以安全地在 URL 栏中显示原始 URL,而不是将字节传递给浏览器的计算机的主机名。
签名的 AMP 内容是除了(而不是代替)常规 AMP 内容交付的。
签名交换适用于我吗?
要实现签名交换,您必须满足以下要求
- 能够配置和控制服务器生成的 HTTP 标头。(大多数纯粹基于 Web 的托管解决方案(例如 Blogger)与签名交换不兼容。)
- 能够生成 AMP 签名交换,例如通过运行
amppackager
作为 Go 二进制文件或在 Docker VM 中运行。 - 打包程序需要每六周更新一次。
- 能够 Vary 边缘 HTTP 服务器上的
Accept
和AMP-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
生成签名交换。但是,如果这不适合您的生产环境,则可以改用命令行客户端 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-----
安装
测试
当由 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=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 Webstore 安装它,并将 Request Headers
配置为 amp-cache-transform
,其 Value
为 google
。
在请求 https://example.com/
之后,您的服务器将交付签名交换,但它应该看起来和以前一样。您需要检查是否通过DevTools 控制台正确返回签名交换。
在 Network
选项卡下,单击您的域名,并检查 Signed HTTP exchange
是否出现在 Preview
下。
使用 Google AMP 缓存
确认签名交换与 Google AMP 缓存兼容。这与它们在 Google 搜索等搜索引擎上的可发现性有关。
要在 Google AMP 缓存中测试签名交换,请在 DevTools 中打开网络选项卡,启用 Preserve log
,然后访问诸如 https://example-com.cdn.ampproject.org/wp/s/example.com/
之类的 URL。
如果请求成功,开发者工具 (DevTools) 将会显示一个带有 signed-exchange
行和一个 from signed-exchange
行的 200
状态码。
如果请求不成功,则会缺少 signed-exchange 行,或者这些行会以红色高亮显示。 还可能存在提供额外信息的 warning
标头。
Google 搜索中的签名交换
如果您的 AMP 页面已成功作为签名交换分发,它们的搜索结果将显示 AMP 闪电标志,与之前相同,但点击结果将在 URL 栏中显示 https://example.com
,而不是以 https://www.google.com/amp/….
开头的 URL。此外,viewer
工具栏不会出现。
在 DevTools 控制台的 network
选项卡下,您可以在 type
列中看到 signed-exchange
。
签名交换服务提供商
以下是提供开箱即用签名交换支持的 CDN 和托管提供商列表。 使用其中一个是最容易上手签名交换的方法。
- AMP Packager Google Cloud 一键部署安装程序 AMP Packager 是一个通过使用签名交换提供 AMP 来改进 AMP URL 的工具。在 AMP 博客 中阅读更多内容。
- Cloudflare AMP Real URL. Cloudflare 是世界上最大的网络之一。如今,企业、非营利组织、博客作者以及任何有互联网存在的人都可以借助 Cloudflare 拥有更快、更安全的网站和应用程序。
-
作者: @CrystalOnScript