WebSocket连接wss失败

20
我已购买证书并在我的node.js网站上安装。但浏览器中的https显示为绿色且正常。现在,我正在尝试使用wss建立套接字连接,但失败了。在Javascript客户端方面的错误如下所示。
   WebSocket connection to 'wss://securedsitedotcom:3003/call' failed:        
   WebSocket opening handshake was canceled

请帮忙!

客户端代码(Javascript)

var ws = new WebSocket('wss://securedsitedotcom:3003/call');

服务器端代码(node.js)

 https = require('https');
 var server = https.createServer({
    key: fs.readFileSync(config.certKeyPath),
    cert: fs.readFileSync(config.certCrt),
    requestCert: true,
    rejectUnauthorized: false
 },app);
 server.listen(port);
 var wss = new ws.Server({
   server: server,
   path: '/call'
 });

浏览器控制台中的错误:

WebSocket connection to 'wss://securedsitedotcom:3003/call' failed:          

WebSocket opening handshake was canceled

1
服务器在3003端口实现了wss吗? - David Schwartz
听起来像是服务器没有处理连接升级:你能提供更多信息吗? - pietro909
是的,服务器在端口3003上 @DavidSchwartz - notnotundefined
展示一些代码,展示一些日志...进行故障排除。 - Fosco
更新了...添加了更多细节。 - notnotundefined
2个回答

9
最近在Chrome上的工作揭示了一个问题,如果页面使用https服务,则websockets必须使用wss。而如果必须使用wss,则必须使用443端口(并且不是任何其他安全端口,到目前为止我还没有看到任何更改端口的方法),这可能是您的问题,因为您的端口看起来像上面的3003。
现在我正在努力让我的IT团队升级服务器上的Apache,以便可以使用mod_proxy_wstunnel使Apache监听443端口,成为反向代理,并将所有wss流量传递到我的websocket服务器。
希望这可以帮助你。

你知道在Edge、Firefox和Safari上是否也是这种情况吗? - Ray A.

5
我遇到了类似的问题,但是我使用的是自签名证书。你提到你买了一张证书,我猜想它是由证书颁发机构签署的。
否则,就像在我的情况下,未经验证的证书可能会导致“握手失败”的错误。一个已验证的证书要么是由第三方(证书颁发机构,例如VeriSign)验证过的,要么是由客户端显式授权的。
在我的情况下,VeriSign没有签署我的证书(自签名),所以我必须显式地授权它。为此,我只需要用浏览器访问https URL(在您的情况下是“https://securedsitedotcom:3003/call”)。然后会出现“未经授权的主机警告”。您需要授权该例外,然后才能建立WSS连接。
您的服务器可以使用任何端口,不限于443端口。 443是https的默认端口,但可以像您所做的那样显式指定任何端口。
希望对某些人有所帮助。

你的服务器可以使用任何端口,这是真的,但我仍然可以访问。WebSocket 连接到 'ws://maximumroulette.com:10066/' 失败:在接收握手响应之前连接关闭。WebSocket 连接到 'wss://maximumroulette.com:10066/' 失败:WebSocket 开启握手被取消。杀了我吧... - Nikola Lukic
2
好久不见,希望你已经解决了它。否则,就像我在回复中所说的那样,“开放握手被取消”错误可能是由于您的浏览器保护您免受未经验证的来源(也就是说,您的证书要么未被CA(如Verisign)签名,要么未被明确授权)。若要通过Chrome授权,请访问https服务器并通过警告或在设置=> https/ssl => 管理证书=>从那里授权。 - w4rt3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接