javascript - 从 Chrome 94+ 与不支持来自 Web 应用程序的 HTTPS 的 LAN 设备通信
问题描述
我们开发了一个 Web 应用程序,它通过发送 POST 请求与连接到同一 LAN 的打印机进行通信。
这种打印机在端口 80 上打开了一个服务器,该服务器接受包含命令的 XML。
无法从通过 HTTPS 加载的页面与网络设备进行通信;因此,我们使用了一种解决方法来保持与它的通信:我们打开一个普通的 http:// 弹出窗口并将其用作代理(使用 postMessage)代表页面发送请求,有效地充当代理。
此解决方案目前适用于 Firefox,但停止适用于最新的 Chrome 版本(>91?)。
“停止工作”是指请求错误net::ERR_FAILED
,这仅发生在某些设备上 - 例如,我运行 Chrome 94 的 Ubuntu 机器。
我们可以开发一个桌面或移动应用程序,仅作为打印机的代理,或者将 Web 应用程序本身作为禁用 CORS 的 Electron 应用程序分发,但与“正常工作”相比,这两种解决方案对于最终用户来说听起来都非常糟糕和臃肿" 在每台安装了浏览器的设备上。
总之,在 2021 年,从 HTTPS 页面与不支持 HTTPS 的网络设备通信的正确方法是什么?
解决方案
根据@sideshowbarker 的评论,这是由于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 之类的东西用于相同目的。
推荐阅读
- c++ - 如何检查我的字符串输入是否遵循 C++ 中的正确语法?
- python - 如何在python中获得堆积条形图
- ajax - 浏览器中的 Ajax 请求句柄以及如何在完成后从网络选项卡中删除 ajax 请求
- python-3.x - return 语句如何在递归函数中工作?
- java - 在 Minecraft 服务器上重新启动控制台
- python - 将字母与Python中列表中的相应数字匹配
- git - 强制 git log 显示所有提交,包括精选的
- python - 随机数生成器,不可散列类型“列表”
- swift - Swift:按下时更改按钮的样式并重置其他按钮
- c++ - 如何设置浮点数的精度?