在 HTTPS 页面上创建 websocket 对象时,如何阻止 chrome 将 websocket 从 WS 升级到 WSS

Posted

技术标签:

【中文标题】在 HTTPS 页面上创建 websocket 对象时,如何阻止 chrome 将 websocket 从 WS 升级到 WSS【英文标题】:How to stop chrome from upgrading websockets from WS to WSS when the websocket object is created on an HTTPS page 【发布时间】:2021-12-28 05:53:18 【问题描述】:

我在这里做了一个真正的Minecraft浏览器端口,它只支持多人游戏,它基于websockets。

https://g.eags.us/eaglercraft/

我希望此页面上的游戏能够使用 WS 和 WSS websocket 协议连接到服务器,因此对于那些只是尝试设置小型私人服务器的人来说,购买 web SSL 证书并不是强制性的。从学校电脑或其他东西上玩这个游戏。我的原始服务器和 cloudflare 目前都配置为仅严格使用 HTTPS,并且您通常无法从安全的 HTTPS 页面初始化不安全的 WS websocket,这意味着任何试图通过我的“官方”链接在自己的服务器上玩游戏的人都需要一个SSL 证书和 WSS URI。

我已将content-security-policy: upgrade-insecure-requests 标头添加到我在上面发布的链接中。我的印象是,即使页面是通过 HTTPS 加载的,但它似乎不起作用,也可以在页面上建立常规的不安全 HTTP/WS 连接。当我在此页面的 chrome devtools 控制台中创建 WebSocket 对象并尝试将其连接到 WS URI 时,网络选项卡显示该对象使用的实际请求已将 URI 中的 WS 替换为 WSS,即使我键入的 URI 是WS。

如何禁用此特定页面的所有这些行为并按原样执行 websocket 请求

【问题讨论】:

请注意,这些天您不必为 SSL 证书付费。 Let's Encrypt 等服务免费提供。 content-security-policy: upgrade-insecure-requests 宣布请求者支持安全连接并请求升级连接。见Upgrade-Insecure-Requests 您无法从https: 页面建立ws: 连接。这会使安全页面不安全,因此浏览器会阻止它。浏览器中有配置可以更改此行为,但不建议这样做,因为它会削弱安全性。见Allowing insecure WebSocket connections @Ouroborus 这并没有真正帮助我,您发布了错误的 MDN 链接,您发布的链接是针对一个也名为 upgrade-insecure-requests 的实际标题。我说的是一个名为 content-security-policy 的标头,它有 upgrade-insecure-requests 作为可能的参数 @Ouroborus 我完全了解浏览器默认设置为不执行此操作的原因我明白了我不需要人们告诉我为什么这样做是不好的做法我只是要求有人给我一个真正公正的直接回答我的问题,没有别的 【参考方案1】:

我误解了标题的行为。它像宣传的那样工作,将 URI 从 WS 升级到 WSS。我最初将其解释为一个标头,它为浏览器应用权限覆盖,以将所有套接字 URI 视为已升级到 WSS,而无需实际升级底层 URI 和请求。

对我凌晨 3:00 的困惑表示歉意,请参阅MDN Page 了解更多说明

【讨论】:

以上是关于在 HTTPS 页面上创建 websocket 对象时,如何阻止 chrome 将 websocket 从 WS 升级到 WSS的主要内容,如果未能解决你的问题,请参考以下文章

为需要在我的网站上自动更新数据的每个页面制作许多 https websocket 服务器是不是很好?

nodejs-webSocket初次使用(页面链接和创建自己的服务)

nodejs-webSocket初次使用(页面链接和创建自己的服务)

Canvas + WebSocket + Redis 实现一个视频弹幕

spring对websocket的集成和使用

websocket的消息推送只能固定在某一个页面吗?