从 Chrome 94+ 与不支持来自 Web 应用程序的 HTTPS 的 LAN 设备通信

Communicating from Chrome 94+ with LAN devices that do not support HTTPS from a web app

我们开发了一个 Web 应用程序,它通过向打印机发送 POST 请求来与连接到同一 LAN 的打印机进行通信。

此类打印机在端口 80 上打开了一个服务器,该端口使用 XML 包含命令。

无法从通过 HTTPS 加载的页面与网络设备通信;因此,我们使用了一种解决方法来保持与它的通信:我们打开一个普通的 http:// 弹出窗口并将其用作代理(使用 postMessage)代表页面发送请求,有效地充当代理。

此解决方案目前适用于 Firefox,但已停止适用于最新的 Chrome 版本(>91?)。

我所说的“停止工作”是指 net::ERR_FAILED 请求出错,这只发生在某些设备上 - 例如,我的 Ubuntu 机器 运行 Chrome 94.

我们可以开发桌面或移动应用程序仅作为打印机的代理,或者将 Web 应用程序本身作为禁用 CORS 的 Electron 应用程序分发,但与在安装了浏览器的每台设备上“正常工作”的东西。

总而言之,在 2021 年,从 HTTPS 页面与不支持 HTTPS 的网络设备通信的正确方法是什么

根据@sideshowbarker 的评论,这是由于 the new Private Access Network policies 包含在 Chrome 94 和 Edge Chromium 中。

简而言之,它们限制了网站与本地网络上的设备通信的能力。

更新: 以下是没有必要的。 经过一些研究,显然 设置“阻止不安全的专用网络请求”就足够了。在 chrome://flags 中标记为“禁用”。这也适用于 OSX、Android、iOS 和 Linux 设备,而不是 Windows 注册表解决方法。

下面是以前的解决方案。

我们的大多数客户都在使用 Windows,因此作为临时解决方法,我们使用一个简单的 .reg 文件禁用了新限制,他们可以双击并应用:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
"InsecurePrivateNetworkRequestsAllowed"=dword:00000001

[HKEY_CURRENT_USER\SOFTWARE\Policies\Google\Chrome]
"InsecurePrivateNetworkRequestsAllowed"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
"InsecurePrivateNetworkRequestsAllowed"=dword:00000001

[HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Edge]
"InsecurePrivateNetworkRequestsAllowed"=dword:00000001

这会禁用这项新的安全功能,因此请记住它会带来一些安全问题。

为了以明确的方式解决问题,我们联系了与我们通信的设备的制造商,他们将开始销售支持 https 的外部硬件。我们可以与其通信,而无需升级整个设备。

如果制造商无法提供帮助,可以使用 Raspberry Pi 之类的东西来达到相同的目的。