仅Firefox下WSS over SSL连接失败(错误码1006)技术求助
解决Firefox 80中WebSocket连接错误1006的问题
针对你遇到的Firefox独有的WebSocket连接错误1006(异常关闭),结合你的IIS+iisnode+Express环境,我整理了几个高优先级的排查和修复方向:
1. 检查SSL证书的Firefox兼容性
错误1006常和底层TCP连接断开有关,而Firefox对SSL证书的校验逻辑比Chrome/IE更严格:
- 在Firefox中直接访问你的HTTPS站点(
https://<host>),点击地址栏的锁图标,查看证书详情,确认没有任何警告(比如证书链不完整、使用已废弃的SHA-1算法、Subject Alternative Name(SAN)未包含你的域名)。 - 如果证书有问题,重新生成符合Firefox要求的证书:确保使用SHA-256及以上签名算法,包含正确的SAN字段,并且完整安装中间证书(避免“证书不受信任”的隐性错误)。
2. 确认iisnode的WebSocket转发配置
虽然你已经禁用了IIS原生WebSocket,但老版本的iisnode(0.2.21是2019年的版本)可能和Firefox的握手逻辑存在兼容问题:
- 在web.config的
<iisnode>节点中添加websocketUpgrade="true"配置,确保iisnode正确转发WebSocket升级请求到Node.js:<iisnode websocketUpgrade="true" /> - 尝试升级iisnode到最新的稳定版本(即使官方维护较少,新版本通常会修复浏览器兼容问题)。
- 检查web.config中的URL重写规则,确保
/ws路径的请求没有被IIS拦截,而是正确转发到你的Node.js应用。
3. 修正Express服务器的HTTPS配置(关键排查点)
看你的app.js代码,虽然引入了https模块,但实际用的是app.listen()——这会创建HTTP服务器,而不是HTTPS服务器。如果IIS没有做SSL终止(或者转发逻辑有问题),Firefox可能会拒绝wss连接:
- 如果IIS处理SSL终止(即IIS负责证书,转发HTTP请求到Node.js):确保Node.js应用监听HTTP端口,且IIS的重写规则正确转发WebSocket请求。
- 如果Node.js直接处理SSL:需要用
https.createServer()加载证书后再监听,示例代码:const fs = require('fs'); const httpsOptions = { key: fs.readFileSync('./path/to/private-key.pem'), cert: fs.readFileSync('./path/to/certificate.pem'), ca: fs.readFileSync('./path/to/ca-bundle.pem') // 若有中间证书需添加 }; const server = https.createServer(httpsOptions, app); // 注意:WebSocket路由会自动附着在这个HTTPS服务器上 server.listen(process.env.PORT || 443);
4. 优化WebSocket的CORS和请求参数处理
- CORS配置:虽然你用了
cors中间件,但WebSocket的握手请求(HTTP GET)可能需要更宽松的CORS设置。尝试修改cors配置:app.use(cors({ origin: true, // 允许所有合法的Origin credentials: true // 允许携带凭证(如果你的连接需要) })); - URL参数编码:Firefox对URL特殊字符的校验更严格,确保所有query参数都用
encodeURIComponent编码:var socket = new WebSocket(`wss://<host>/ws?request_type=init&usr=${encodeURIComponent(UserID)}&connid=${encodeURIComponent(connectTime)}&pageid=${encodeURIComponent(page_ID)}`);
5. 检查Firefox的本地设置
- 在Firefox地址栏输入
about:config,搜索network.websocket.enabled,确保值为true。 - 检查是否有代理设置影响WebSocket连接(比如公司代理不支持wss),可以尝试关闭代理后测试。
如果以上步骤都没解决问题,可以在Firefox的开发者工具中开启WebSocket的详细日志:
- 打开开发者工具 → 设置(齿轮图标)
- 勾选“网络”下的“WebSocket日志”
- 重新连接WebSocket,查看控制台的详细握手日志,寻找具体的失败原因(比如握手响应异常、证书错误提示等)
内容的提问来源于stack exchange,提问作者Madhuram Swaminathan
相关产品推荐
相关产品推荐

