使用签名交换服务 AMP
AMP 通过缓存和预加载等技术,在格式之外提供了速度优势。当嵌入到 AMP 查看器 中时,这些优势可能会带来一些 缺点,例如显示额外的 URL。通过使用签名交换服务 AMP 内容,您可以使用新的 Web 平台功能来克服所有这些缺点。
签名交换由有效的 AMP 文档和内容的原始 URL 组成。此信息受数字签名保护,这些数字签名将文档安全地绑定到其声明的 URL。这使浏览器能够安全地在 URL 栏中显示原始 URL,而不是将字节传递到浏览器的计算机的主机名。
签名 AMP 内容除了(而不是替代)常规 AMP 内容之外进行传递。
签名交换适合我吗?
要实施签名交换,您必须满足以下要求
- 能够配置和控制您的服务器生成的 HTTP 标头。(大多数纯粹的基于 Web 的托管解决方案(例如 Blogger)与签名交换不兼容。)
- 能够生成 AMP 签名交换,例如,通过运行
amppackager
作为 Go 二进制文件,或在 Docker VM 中。 - 打包器需要每六周更新一次。
- 能够在边缘 HTTP 服务器上 Vary
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/
服务器上。)
验证响应是否始终包括值为 Accept,AMP-Cache-Transform
的 Vary
标头(无论 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 网上应用店安装它,并将 Request Headers
配置为 amp-cache-transform
,其中 Value
为 google
。
请求 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
标头。
Google 搜索中的签名交换
如果您的 AMP 页面已作为签名交换成功分发,则其搜索结果将显示 AMP 闪电标志(与之前相同),但是点击结果将在 URL 栏中显示 https://example.com
,而不是以 https://www.google.com/amp/….
开头的 URL。此外,不会显示 viewer
栏。
在开发者工具控制台中,在 network
选项卡下,您将可以在 type
列下看到 signed-exchange
。
签名交换服务提供商
以下是提供对签名交换开箱即用支持的 CDN 和托管提供商的列表。使用其中之一是开始使用签名交换的最简单方法
- AMP 打包器 Google Cloud 一键式部署安装程序 AMP 打包器是一种通过使用签名交换服务 AMP 来改进 AMP URL 的工具。请在 AMP 博客中阅读更多内容。
- Cloudflare AMP 真实 URL。Cloudflare 是世界上最大的网络之一。如今,企业、非营利组织、博客作者以及任何拥有互联网存在的人都因 Cloudflare 而拥有更快、更安全的网站和应用程序。
-
由 @CrystalOnScript 撰写