使用签名交换提供 AMP
重要提示:本文档不适用于您当前选择的格式 广告!
AMP 通过缓存和预加载等技术提供了超越格式本身的速度优势。当嵌入 AMP 查看器中时,这些优势可能会带来缺点,例如显示额外的 URL。通过使用签名交换提供 AMP 内容,您可以使用新的 Web 平台功能来克服所有这些问题。
签名交换由有效的 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 请求指定时,您的暂存站点是否使用 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=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-Transform
的 Vary
标头(无论 MIME 类型是 text/html
、application/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
标头,其中提供其他信息。
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 撰写