很多浏览器一连接WSS服务器就断开

我的h5游戏,有一个怪现象
连接WSS服务器
在电脑edge浏览器一连就断开
用chrome浏览器就一切正常
用手机浏览器也是一连就断开

请问应该如何解决?

代码就是普通的 this.websocket = new WebSocket(“wss://wss.asdfasdfa.cn:12345/”)

ssl证书配置一下呢

证书呢??????????

cocos-test-projects/assets/cases/network/NetworkCtrl.ts at 07f5671e18ef3ed4494d8cba6c2f9499766467a6 · cocos/cocos-test-projects · GitHub

看看DEMO,人家弄了证书的

后台有证书,还有一个私钥
前台也要证书吗?

你遇到的问题是一个典型的 WebSocket 连接问题,具体来说,WebSocket (wss://) 连接在某些浏览器(如 Edge 和移动设备浏览器)中正常,但在其他浏览器(如 Chrome)中却出现连接断开的现象。

这种情况可能是由以下原因引起的:

1. 浏览器的 WebSocket 安全策略

不同的浏览器在处理 WebSocket 连接时可能会有不同的安全策略,尤其是在不同平台(PC vs. 移动设备)和不同浏览器之间。以下是一些可能导致问题的因素:

  • 浏览器对证书的要求:浏览器可能对 wss:// 连接(即 WebSocket over SSL)有更严格的证书验证要求。如果你使用的是自签名证书或者证书未正确配置,某些浏览器可能会拒绝连接。
  • 跨域请求限制:如果你的 WebSocket 服务器和客户端在不同的域名或端口下运行,可能会受到浏览器的跨域安全策略(CORS)的限制,导致连接被中断。
  • HTTP/2 和 WebSocket:一些浏览器(如 Edge)在与 WebSocket 建立连接时可能与 HTTP/2 有兼容性问题,这可能导致连接被中断。

2. WebSocket 服务器配置问题

  • 超时设置:某些 WebSocket 服务器可能在默认情况下对连接的最大空闲时间有超时限制。如果客户端没有发送数据或进行心跳检测,服务器可能会断开连接。
  • 连接限制:如果 WebSocket 服务器对每个客户端的连接数有限制,可能会出现某些设备或浏览器的连接被断开的现象。

3. TLS/SSL 问题

  • SSL/TLS 协议版本不匹配:有些浏览器(特别是较老版本的 Edge 或移动设备浏览器)可能对 WebSocket 使用的 TLS/SSL 协议版本要求较高,尤其是 wss:// 连接时。如果服务器的 SSL 配置不支持较新的协议版本,浏览器可能无法建立连接。
  • 证书链问题:某些浏览器对 SSL 证书链的要求比其他浏览器更为严格。证书链不完整或使用过期证书可能会导致连接断开。

4. 浏览器配置或插件干扰

  • 浏览器插件或扩展:某些浏览器插件(如广告拦截器、隐私保护工具等)可能会干扰 WebSocket 连接,导致连接无法保持。尝试禁用扩展程序看是否能解决问题。
  • 浏览器设置:在一些浏览器中,可能需要启用某些设置才能允许 WebSocket 连接。例如,某些浏览器的隐私设置可能会阻止 WebSocket 连接。

5. 网络环境问题

  • 防火墙或代理服务器:某些防火墙或代理服务器可能会阻止 WebSocket 连接。移动设备和桌面设备可能连接到不同的网络,导致出现差异。
  • 网络不稳定:移动网络的质量可能会影响 WebSocket 连接,特别是在信号不稳定的情况下。你可以通过检查连接的网络环境来排查是否为网络问题导致连接中断。

6. WebSocket 客户端实现问题

  • 连接代码的问题:你的客户端代码中可能存在一些特定的设置或实现问题,导致在某些浏览器中无法正常连接。例如,某些浏览器可能更严格地检查连接的启动过程。

解决方案

1. 检查 SSL 证书配置

确保你的 wss:// 服务器使用的是有效的 SSL 证书,并且证书链完整。你可以使用像 SSL Labs 这样的工具检查服务器的 SSL 配置。

2. 增加 WebSocket 重连逻辑

如果是连接不稳定的问题,可以在客户端实现重试机制,确保在连接断开时能够自动重连。例如,使用如下代码来检测 WebSocket 断开并重新连接:

let ws;

function connectWebSocket() {
    ws = new WebSocket('wss://your-websocket-server.com');
    
    ws.onopen = () => {
        console.log('WebSocket connected');
    };
    
    ws.onclose = () => {
        console.log('WebSocket disconnected, retrying...');
        setTimeout(connectWebSocket, 1000); // 延迟1秒后重连
    };
    
    ws.onerror = (error) => {
        console.log('WebSocket error:', error);
    };
}

// 初始连接
connectWebSocket();

3. 检查跨域和 CORS 设置

确保服务器正确设置了 CORS(跨域资源共享)头,允许来自你客户端域的连接。可以通过服务器的 HTTP 响应头进行配置:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization

4. 检查网络环境

检查你的设备是否使用了代理、VPN 或防火墙。如果是移动设备出现问题,尝试切换到不同的网络环境(如 Wi-Fi 连接)。对于桌面浏览器,检查防火墙设置。

5. 浏览器兼容性

确保你使用的 WebSocket 协议和方法在所有目标浏览器中都是支持的。可以查看 MDN 的 WebSocket 文档 来确保你的实现符合规范。

6. 日志和调试

在浏览器的开发者工具中,查看 Console 和 Network 标签中的错误信息。特别是 WebSocket 连接的错误,可以帮助你识别问题的根源。

总结

问题的根本原因可能是浏览器安全策略、WebSocket 服务器配置或网络环境问题。你可以从以下几个方向进行排查:

  1. 检查 SSL 配置,确保证书有效。
  2. 查看浏览器控制台,排查连接错误信息。
  3. 实现重连机制,避免因短期网络波动导致断开。
  4. 检查 CORS 设置,确保跨域允许。
  5. 尝试禁用浏览器插件,排除干扰。

通过这些方法,你应该能更好地定位问题并解决它。

看demo,人家客户端的DEMO,是带证书的。

安全策略问题:
1 域名要有公开签名的证书,不能是私人签名。
2 访问wss的网页也得是https的。

服务器是这个,检查证书好像都对,签名是阿里云3个月个人免费证书
wss://wss.iotlabor.cn:12348
游戏是用这个链接打开
https://https.iotlabor.cn/public/static/build/web-mobile-001/

启动服务器的方法,完全用现成的执行文件测试能否建立连接(实际测试只有Chrome浏览器能验证成功,其它浏览器一连上就立刻断开)
.\openssl.exe s_server -accept 12348 -cert .\wss.iotlabor.cn_public.crt -key .\wss.iotlabor.cn.key -CAfile wss.iotlabor.cn_chain.crt


下面是Chrome浏览器在游戏里点登录的反应(正常)

下面是Edge历览器在游戏里点登录的反应(连上瞬间就断开)

不确定阿里云的证书有没有问题。

用 postman或者 Online Websockets Tester - Debug Client Tool

和nodejs分别连接试试。

游戏网站能测试通过,有些不行。
Chrome浏览器100成功,其它浏览器只有1%的可能性成功。
微信开发者工具里大概是1/20的比例能连成功,
手机里测试小程序100%失败


你这连接怎么没写端口号? 还是说你niginx配置了?
一般按比例连通有两种情况:
1 niginx 配了多后端,只有某几个后端上有服务。
2 你的服务器收包堵塞,部分请求无法响应

你这个都不像啊

我的后台服务器是直接支持SSL TLS
没有用nginx转发
直接对外就是443端口

昨天把中间证书配好后,我在家里用WiFi上网页和微信小程序,平均下来大概10次能量成功一次,一旦连成功了,后面一切都正常。

但是今天我把手机从家里拿出来用流量
网页和微信小程序试了几十次都是100%的失败。

这种写个最简单的测试代码看下啊,,

今天不论是WiFi还是流量都连不上了
我听说443端口要备案的,不知道是不是ISP给我断了
我下次换个端口试试

感觉是tls版本支持问题,我这边用命令行curl https://wss2.iotlabor.cn:443也是连不上,但是chrome、edge浏览器都可以。wireshark抓了下包,看上去是握手的时候用的tls版本不一样。

SSL在线工具-SSL/HTTPS协议检测-TLS版本检测-加密套件检测-SSLeye官网 看了下你的域名是只支持tls1.3和tls1.2。虽然很多官方都说早要废弃tls1.1等之前的版本了,但估计还有很多类似curl这样的还是默认用的tls1。建议你找找你网站部署的如nginx配置怎么支持tls1.1和tls1.0再试试

.\openssl.exe s_client -connect wss2.iotlabor.cn:12348
这个命令在服务器执行100%成功
在家里打开失败几十次会成功一次。
提了阿里云工单,说是我没有接入备案,他们在内网访问时100%成功,
我自己用IP访问也是100%成功。
但是IP访问的证书和访问地址必须一样,IP访问肯定不行。
现在正在走备案接入流程,先等阿里云初审,之后由阿里云转交广东通信管理局正式审核。