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