针对非安全上下文的专用网络访问 (PNA) 弃用试用已结束 - 请实施 PNA 权限提示

Yifan Luo
Yifan Luo

Chrome 124 包含用于放宽混合内容限制的专用网络访问权限功能。我们正在针对需要更多时间为此次变更做好准备的网站开展弃用试用,但此试用将于 Chrome 132(预计于 2025 年 2 月 4 日发布)发布时结束。本文介绍了此次变更、该功能的设计、如何迁移当前网站以及如何测试实现情况。

有何变化?

为了与没有全局唯一名称而无法获取 TLS 证书的专用网络上的设备建立连接,此功能为 fetch() 引入了一个新选项,以声明开发者与此类设备进行通信的意图。这包括一项由政策控制的新功能,用于控制每个网站对此功能的访问权限,以及用于服务器预检查响应的新标头,以提供额外的元数据。

什么是专用网络访问?

专用网络访问 (PNA,以前称为 CORS-RFC1918,简称“本地网络访问”)是一项安全功能,用于限制网站向专用网络上的服务器发送请求的功能。这有助于保护用户和内部网络免受跨站请求伪造 (CSRF) 等潜在攻击的影响。Chrome 一直在逐步实现 PNA,并将在即将发布的版本中扩大保护范围。

为什么需要显示权限提示?

Chrome 94 引入了针对来自不安全公共网站的专用网络访问的屏蔽功能。正在进行的 “从不安全情境访问专用网络”的弃用试用表明,在将受影响的网站迁移到 HTTPS 时面临挑战。一个常见问题是将专用设备迁移到 HTTPS 的难度,这会导致混合内容检查违规。

为了解决这一难题,我们在源试用(从 Chrome 120 开始)和从 Chrome 124 开始的稳定版中添加了一个新的权限提示。

何时需要显示权限提示?

我们计划在权限提示功能推出后的几个里程碑阶段结束非安全上下文弃用试用。为了确保兼容性,您必须将您的公开网站迁移到 HTTPS。如果您无法将私有服务器迁移到 HTTPS,则可以通过新的权限提示功能放宽混合内容检查。

带有权限提示的专用网络访问权限请求的典型工作流如下所示。

触发权限提示

将新的 targetAddressSpace 属性添加为提取选项,则请求可以跳过混合内容检查。

fetch("http://router.local/ping", {
  targetAddressSpace: "private",
});

根据专用网络访问:引入预检查,任何专用网络请求都需要先发出预检查请求。此预检请求将包含一个新标头 Access-Control-Request-Private-Network: true,相应的响应必须包含标头 Access-Control-Allow-Private-Network: true

为了适应新的权限提示,设备必须包含两个新的响应标头:Private-Network-Access-NamePrivate-Network-Access-ID

  • Private-Network-Access-ID:一个 48 位值,表示为 6 个十六进制字节,以英文冒号分隔。
  • Private-Network-Access-Name:一个有效的名称(字符串),与 ECMAScript 正则表达式 /^[a-z0-9_-.]+$/. 匹配。名称的长度不得超过 248 个 UTF-8 代码单元。
Private-Network-Access-Name: "My Smart Toothbrush"
Private-Network-Access-ID: "01:23:45:67:89:0A"

演示

您可以通过以下网址查看演示:https://private-network-access-permission-test.glitch.me/

您需要启动个人专用服务器才能使用演示网站。私有服务器应使用 HTTP 标头 Access-Control-Allow-Private-Network: true 以及服务器指定的标头 Private-Network-Access-IDPrivate-Network-Access-Name 进行响应。如果一切设置正确无误,系统应显示以下权限提示:

退出非安全上下文弃用试用

对于已注册针对不安全情境的专用网络访问功能弃用试用计划的网站,您可以使用我们的新权限提示迁移网站并立即退出试用。

更新代码后,请删除 HTML、JavaScript 或 HTTP 标头中的试用令牌。如果您不记得将试用令牌放在哪里,请参阅上篇博文中的注册试用弃用功能部分。

您可能还需要在试用页面中删除令牌。

后续操作

针对非 API fetch() 的请求的解决方案仍在探索中。

我们已测试了多种解决方案,例如使用服务工或将目标地址空间作为新的 Content-Security-Policy。不过,非 API fetch() 请求的最终形式仍在研究中。

将来,我们可能会通过权限政策支持来自子帧的请求。

未来,我们可能希望支持权限政策,以放宽子帧的功能。

针对专用网络用例的反馈

如果您在需要来自公共网络的请求的专用网络上托管网站,Chrome 团队希望您提供反馈!在 Chromium 问题跟踪器(组件:Blink>SecurityFeature>CORS>PrivateNetworkAccess)或 GitHub 代码库中提交问题。

资源