WebSocket 连接在 Chrome 上失败,没有 SSL

WebSocket connection fails on Chrome without SSL

我正在标准网页和 Tomcat v7.0.62 服务器之间设置 WebSocket。在 Firefox、Edge 和 IE11 上使用 Tomcat SSL 转换为 on/off 的连接工作正常。但是,在 Chrome (v66.03) 中,只有当我在服务器上打开 SSL 并通过 https 连接时,websocket 才会连接。在 Chrome 中,当我在服务器上关闭 SSL 并尝试通过 http 连接时,它会抛出一个错误。

这是在尝试通过 http 连接并关闭 SSL 时抛出的错误 Chrome Tomcat...

Error in connection establishment: net::ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION

这是我在客户端的 WebSocket 连接代码...

var wss = "wss://";
if (document.location.protocol === "http:") {
   wss = "ws://";
}
var wsURL = wss + document.location.host + "/status?sessionId=<%=session.getId()%>";

这是 Chrome 需要在非 https websocket 连接上使用特殊代码的特定内容吗?

我无法确认你的问题。您可以在此处尝试回声测试:http://www.websocket.org/echo.html

网站支持http和https,您可以指定ws://echo.websocket.orgwss://echo.websocket.org。我已经尝试了所有的组合,它们都对我有用。

我的猜测是您的服务器配置问题或您的浏览器扩展有问题。

Error in connection establishment: net::ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION

看来您可能在客户端和服务之间有一个带有身份验证的代理。根据代理和客户端配置,它可能会允许通过 SSL 连接,但纯 http 将被过滤。

这是 Chrome 特定行为。 Chrome 不允许不安全的 websocket (ws) 连接到本地主机(仅 wss,因此您应该为本地 web/websocket 服务器设置 TLS 证书)。但在 Firefox 和其他浏览器中同样应该可以正常工作。

请参阅有关此问题的 Chromium 的 Chrome 错误报告。这个特殊问题是有意为之的,他们做出这个改变是为了 Chrome 通过防止对侦听本地主机的内部网络设备和进程的攻击更加安全。

https://bugs.chromium.org/p/chromium/issues/detail?id=378566