将此发布给遇到相同问题的其他人。
我正在开发一个使用 stanza.io 连接到 XMPP 服务器(在我的例子中是 Prosody)的浏览器客户端。我默认使用 wss://连接。在开发过程中的某个时候,我的客户端根本无法连接 - 它会立即静静地断开连接,而不提供任何有用的错误信息。
没有错误日志、没有错误代码、没有确认对话框或确认栏,也没有任何可能出错的迹象。
最佳答案
经过几个小时的调试,我终于找到了问题所在;当我在搞乱 XMPP 服务器的配置时,我为 XMPPd 重新生成了 SSL 证书。因为我使用的是自签名证书,所以这会导致 SSL 错误。因为我之前曾通过 HTTPS 访问过相同的 URI,所以我已经手动批准了旧的自签名证书 - 但显然在重新生成 SSL 证书后该批准不再有效。
问题的关键在于:如果您的 SSL 证书引起任何类型的警告,wss://
WebSocket 连接将立即失败,并且没有规范的检测方法这个。
如上所述,似乎没有标准化的方法来检测此问题是否正在发生,更不用说解决它了。我能够找到的解决此问题的最佳方法如下:
- 如果 WebSocket 在收到登录确认(特定于 XMPP)之前断开连接,请尝试建立明文
ws://
(无 SSL)连接非 SSL 端口。 - 如果明文连接成功,这意味着服务器已启动 - 因此问题出在 SSL 证书上。 (如果明文连接也失败,则服务器根本不可用。)
- 向用户显示错误,表明存在 SSL 问题,他们应该检查证书,并说明如何手动批准证书。
- 提供指向
wss://
URL 的target="_blank"
链接,但将协议(protocol)替换为https://
。这可能是特定于韵律的,但通过访问该 URL,您将看到 SSL 警告页面。 Prosody 将显示以“It works!”开头的文本。批准证书后 - 如果服务器端是自定义应用程序,您应该显示一条消息说“问题已解决,您现在可以关闭此选项卡”。 - 在后台,在主应用程序中,每隔几秒尝试通过 wss://重新连接。一旦连接成功,这意味着用户已经批准了证书。隐藏/删除错误并继续正常的连接/登录过程。
在用户体验方面,这远非一个流畅的过程,但这是我发现的最流畅的方法。不可能将错误页面设置为 iframe(这是我最初的想法之一)——Chrome 将完全拒绝加载它,Firefox 将隐藏“添加异常(exception)”按钮,我想其他浏览器也会表现出类似的行为。
关于ssl - 为什么我的wss ://(WebSockets over SSL/TLS) connection immediately disconnect without giving any errors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23404160/