了解如何使用 Web Packager 投放 Signed Exchange (SXG)。
Signed Exchange (SXG) 是一种提交机制,可让您验证资源的来源,而无需考虑其提交方式。以下说明介绍了如何使用 Web Packager 设置 Signed Exchange。其中包含有关自签名证书和 CanSignHttpExchanges 证书的说明。
使用自签名证书分发 SXG
使用自签名证书分发 SXG 主要用于演示和测试目的。使用自签名证书签名的 SXG 在测试环境之外使用时会在浏览器中生成错误消息,并且不应提供给抓取工具。
前提条件
如需按照这些说明操作,您需要在开发环境中安装 openssl 和 Go。
生成自签名证书
本部分介绍了如何生成可与已签名交换使用且自签名的证书。
操作说明
生成私钥。
openssl ecparam -out priv.key -name prime256v1 -genkey私钥将另存为名为
priv.key的文件。创建证书签名请求 (CSR)。
openssl req -new -sha256 -key priv.key -out cert.csr -subj '/O=Web Packager Demo/CN=example.com'证书签名请求是一块编码文本,用于传达从证书授权机构(CA) 请求证书所需的信息。虽然您不会向 CA 请求证书,但仍需要创建证书签名请求。
上述命令会为名为
Web Packager Demo且具有通用名称example.com的组织创建证书签名请求。通用名称应为包含您要打包为 SXG 的内容的网站的完全限定域名。在正式版 SXG 设置中,此网址应为您拥有的网站。不过,在这些说明中所述的测试环境中,它可以是任何网站。
创建具有
CanSignHttpExchanges扩展的证书。openssl x509 -req -days 90 -in cert.csr -signkey priv.key -out cert.pem -extfile <(echo -e "1.3.6.1.4.1.11129.2.1.22 = ASN1:NULL\nsubjectAltName=DNS:example.com")此命令使用第 1 步和第 2 步中创建的私钥和 CSR 创建证书文件
cert.pem。-extfile标志会将证书与CanSignHttpExchanges证书扩展相关联(1.3.6.1.4.1.11129.2.1.22是CanSignHttpExchanges扩展的对象标识符)。此外,-extfile标志还将example.com定义为正文备用名称。如果您想了解
cert.pem的内容,可以使用以下命令查看:openssl x509 -in cert.pem -noout -text您已成功创建私钥和证书。下一部分中将会用到
priv.key和cert.pem文件。
设置 Web 打包工具服务器以进行测试
前提条件
安装 Web 打包工具。
git clone https://github.com/google/webpackager.git构建
webpkgserver。cd webpackager/cmd/webpkgserver go build .webpkgserver是 Web 打包工具项目中的特定二进制文件。验证
webpkgserver是否已正确安装。./webpkgserver --help此命令应返回有关
webpkgserver用法的信息。如果这不起作用,一个不错的第一个问题排查步骤是验证 GOPATH 是否配置正确。
操作说明
进入
webpkgserver目录(您可能已位于此目录中)。cd /path/to/cmd/webpkgserver通过复制示例来创建
webpkgsever.toml文件。cp ./webpkgserver.example.toml ./webpkgserver.toml此文件包含
webpkgserver的配置选项。使用您选择的编辑器打开
webpkgserver.toml,然后进行以下更改:- 将
#AllowTestCert = false行更改为AllowTestCert = true。 - 更改
PEMFile = 'path/to/your.pem'行,以反映您创建的 PEM 证书cert.pem的路径。请勿更改提及TLS.PEMFile的行,因为这是其他配置选项。 - 更改
KeyFile = 'priv.key'行,以反映您创建的私钥priv.key的路径。请勿更改提及TLS.KeyFile的行,这是其他配置选项。 - 将
#CertURLBase = '/webpkg/cert'行更改为CertURLBase = 'data:'。CertURLBase表示 SXG 证书的服务位置。此信息用于在 SXG 的Signature标头中设置cert-url参数。在生产环境中,CertURLBase的使用方式如下:CertURLBase = 'https://mysite.com/'。不过,对于本地测试,CertURLBase = 'data:'可用于指示webpkgserver使用数据网址将证书内嵌到cert-url字段中。对于本地测试,这是分发 SXG 证书的最便捷方式。 - 更改
Domain = 'example.org'行,以反映您为其创建证书的网域。如果您严格按照本文中的说明操作,则此值应更改为example.com。webpkgserver只会从webpkgserver.toml指示的网域提取内容。如果您尝试从其他网域提取网页,但未更新webpkgserver.toml,webpkgserver日志将显示错误消息URL doesn't match the fetch targets。
可选
如果您想启用或停用子资源预加载,请使用以下
webpkgserver.toml配置选项:如需让
webpkgserver插入用于将样式表和脚本子资源预加载为 SXG 的指令,请将#PreloadCSS = false行更改为PreloadCSS = true。此外,将#PreloadJS = false行更改为PreloadJS = true。除了使用此配置选项之外,您还可以手动将
Link: rel="preload"标头和<link rel="preload">标记添加到网页的 HTML 中。默认情况下,
webpkgserver会将现有的<link rel="preload">标记替换为将此内容作为 SXG 提取所需的等效<link>标记。这样一来,webpkgserver会根据需要设置allowed-alt-sxg和header-integrity指令,HTML 作者无需手动添加这些指令。如需替换此行为并保留现有的非 SXG 预加载,请将#KeepNonSXGPreloads (default = false)更改为KeepNonSXGPreloads = true。请注意,启用此选项可能会导致 SXG 不符合这些要求,无法使用 Google SXG 缓存。
- 将
启动
webpkgserver。./webpkgserver如果服务器已成功启动,您应该会看到以下日志消息:
shell Listening at 127.0.0.1:8080 Successfully retrieved valid OCSP. Writing to cache in /private/tmp/webpkg您的日志消息可能略有不同。具体而言,
webpkgserver用于缓存证书的目录因操作系统而异。如果您没有看到这些消息,一个不错的第一个问题排查步骤是仔细检查
webpkgserver.toml。如果您更新了
webpkgserver.toml,则应重启webpkgserver。使用以下命令启动 Chrome:
shell /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --user-data-dir=/tmp/udd \ --ignore-certificate-errors-spki-list=`openssl x509 -noout -pubkey -in cert.pem | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64`此命令会指示 Chrome 忽略与
cert.pem关联的证书错误。这样,您就可以使用测试证书测试 SXG。如果未使用此命令启动 Chrome,在开发者工具中检查 SXG 时会显示错误Certificate verification error: ERR_CERT_INVALID。注意:
您可能需要调整此命令,以反映 Chrome 在计算机上的所在位置以及
cert.pem的所在位置。如果您已正确完成此操作,则应该会在地址栏下方看到一条警告。警告应类似于以下内容:You are using an unsupported command-line flag: --ignore-certificate-errors-spki-list=9uxADcgc6/ho0mJLRMBcOjfBaN21k0sOInoMchr9CMY=.如果警告不包含哈希字符串,则表示您未正确指明 SXG 证书的位置。
打开开发者工具的 Network(网络)标签页,然后访问以下网址:
http://localhost:8080/priv/doc/https://example.com。这会向
http://localhost:8080上运行的webpackager实例发出请求,请求包含https://example.com内容的 SXG。/priv/doc/是webpackager使用的默认 API 端点。
Network 标签页中列出了以下资源:
- 类型为
signed-exchange的资源。这是 SXG。 - 类型为
cert-chain+cbor的资源。这是 SXG 证书。SXG 证书必须采用application/cert-chain+cbor格式。 - 类型为
document的资源。这是通过 SXG 传送的内容。
如果您没有看到这些资源,请尝试清除浏览器缓存,然后重新加载
http://localhost:8080/priv/doc/https://example.com。点击预览标签页,详细了解已签名交换及其签名。

- 类型为
使用 CanSignHttpExchanges 证书提供已签名广告交易
本部分中的说明介绍了如何使用 CanSignHttpExchanges 证书分发 SXG。在生产环境中使用 SXG 需要 CanSignHttpExchanges 证书。
为简洁起见,在编写这些说明时,我们假定您了解使用自签名证书设置已签名交换部分中讨论的概念。
前提条件
您拥有
CanSignHttpExchanges证书。此页面列出了提供此类证书的 CA。如果您没有证书,可以将 webpkgserver 配置为自动从 CA 检索证书。您可以按照此页面中关于如何填充
webpkgserver.toml的说明操作。虽然这不是强制性要求,但我们强烈建议您在边缘服务器后面运行
webpkgserver。如果您不使用边缘服务器,则需要在webpkgserver.toml中配置TLS.PEMFile和TLS.KeyFile选项。默认情况下,webpkgserver通过 HTTP 运行。不过,浏览器必须通过 HTTPS 提供 SXG 证书,才能将其视为有效。配置TLS.PEMFile和TLS.KeyFile后,webpkgserver便可使用 HTTPS,从而直接向浏览器提供 SXG 证书。
操作说明
通过将您网站的 SXG 证书与您网站的 CA 证书串联起来,创建 PEM 文件。如需了解详情,请点击此处。
PEM 是一种文件格式,通常用作存储多个证书的“容器”。
复制示例,创建一个新的
webpkgsever.toml文件。cp ./webpkgserver.example.toml ./webpkgserver.toml使用您选择的编辑器打开
webpkgserver.toml,然后进行以下更改:- 更改
PEMFile = cert.pem行,以反映包含完整证书链的 PEM 文件的位置。 - 更改
KeyFile = 'priv.key'行,以反映与 PEM 文件对应的私钥的位置。 - 更改
Domain = 'example.org'行,以反映您的网站。 - (可选)如需让
webpkgserver每 90 天(对于 Google 为 45 天)自动续订 SXG 证书,请在webpkgserver.toml的[SXG.ACME]部分中配置选项。此选项仅适用于已设置 DigiCert 或 Google ACME 账号的网站。
- 更改
配置边缘服务器以将流量转发到
webpkgserver实例。webpkgserver处理的请求主要分为两类:SXG 请求(由/priv/doc/端点提供)和 SXG 证书请求(由/webpkg/cert/端点提供)。每种请求类型的网址重写规则略有不同。如需了解详情,请参阅在前端边缘服务器后面运行。注意:
默认情况下,
webpkgserver会在/webpkg/cert/$CERT_HASH(例如/webpkg/cert/-0QmE0gvoedn92gtwI3s7On9zPevJGm5pn2RYhpZxgY)上提供 SXG 证书。如需生成$CERT_HASH,请运行以下命令:shell openssl base64 -in cert.pem -d | openssl dgst -sha256 -binary | base64 | tr /+ _- | tr -d =