为什么我的wss://(基于SSL / TLS的WebSockets)连接会立即断开而不会出现任何错误?

时间:2014-05-01 08:06:02

标签: ssl websocket xmpp

针对遇到同样问题的其他人发布此内容。

我正在使用stanza.io连接到XMPP服务器的浏览器客户端(在我的例子中是Prosody)。我默认使用的是wss://连接。在开发期间的某个时刻,我的客户端根本无法连接 - 它会立即静默断开连接,而不会提供任何有用的错误信息。

没有错误日志,没有错误代码,没有确认对话框或条形图,也没有可能出现错误的迹象。

3 个答案:

答案 0 :(得分:33)

经过几个小时的调试,我终于找到了问题;因为我正在搞乱我的XMPP服务器的配置,所以我重新为XMPPd生成了SSL证书。由于我使用的是自签名证书,因此会导致SSL错误。因为之前我曾通过HTTPS访问过相同的URI,所以我已经手动批准了旧的自签名证书 - 但很明显,在重新生成SSL证书后,批准不再有效。

问题的关键在于:如果您的SSL证书导致任何类型的警告,wss:// WebSocket连接将立即失败,并且没有规范的方法来检测它。

如上所述,似乎没有标准化的方法可以检测到这个问题正在发生,更不用说解决它了。我能找到的这个问题的最佳解决方案如下:

  1. 如果WebSocket在收到登录确认(特定于XMPP)之前断开连接,请尝试将明文ws://不带SSL )连接到非SSL端口。< / LI>
  2. 如果明文连接成功,则表示服务器已启动 - 因此问题在于SSL证书。 (如果明文连接也失败,则服务器根本不可用。)
  3. 向用户显示错误,表明存在SSL问题,并且他们应该检查证书,并提供有关如何手动批准证书的说明。
  4. 提供target="_blank"网址的wss://链接,但将协议替换为https://。这可能是特定于Prosody的,但通过访问该URL,您将看到SSL警告页面。 Prosody将显示以“It works!”开头的文本。批准证书后 - 如果服务器端是自定义应用程序,则应显示一条消息,说明“问题已解决,您现在可以关闭此选项卡”。
  5. 在后台,在主应用程序中,每隔几秒钟继续尝试重新连接wss://。一旦连接成功,这意味着用户已批准证书。隐藏/删除错误并继续正常的连接/登录过程。
  6. 这远不是一个平稳的过程,用户体验,但它是我发现的最顺畅的方法。 iframe错误页面是不可能的(这是我的第一个想法) - Chrome将拒绝加载它,Firefox将隐藏“添加例外”按钮,我想其他浏览器会表现出类似的行为。< / p>

答案 1 :(得分:2)

请记住,现代浏览器不喜欢自签名证书。 因此,如果您的安全elem.addEventListener('touchstart', function(e) { e.preventDefault(); }); 连接在结束握手之前死亡,则可能意味着证书尚未被接受。 为了解决这个问题,您可以:

  • 购买中央机关签署的证明书
  • 只需打开一个新的 Tab或Window链接WebSocket的URI并告诉浏览器 相信这种联系。 回到你的WebSocket,它应该可以工作。

答案 2 :(得分:0)

这就是我所做的并且有效:

1-Generate self signed certificate

2-{{​​3}}