将此发布给遇到同样问题的其他人。
我当时正在开发一个浏览器客户端,它使用 stanza.io 连接到 XMPP 服务器(在我的例子中是 Prosody)。我默认使用 wss:// 连接。在开发过程中的某个时刻,我的客户端根本无法连接 - 它会立即无提示地断开连接,而不提供任何有用的错误信息。
没有错误日志,没有错误代码,没有确认对话框或栏,没有任何可能出错的指示。
经过几个小时的调试,我终于找到了问题所在;当我搞乱 XMPP 服务器的配置时,我为 XMPPd 重新生成了 SSL 证书。由于我使用的是自签名证书,这会导致 SSL 错误。因为我之前通过 HTTPS 访问过相同的 URI,所以我已经手动批准了旧的自签名证书 - 但显然,在重新生成 SSL 证书后,该批准不再有效。
问题的关键在于:如果您的 SSL 证书导致任何类型的警告,wss://
WebSocket 连接将立即失败,并且没有规范的方法来检测这一点。
如上所述,似乎没有标准化的方法来检测这个问题的发生,更别说解决它。我找到的解决这个问题的最佳方案如下:
- 如果 WebSocket 在收到登录确认(特定于 XMPP)之前断开连接,请尝试创建明文
ws://
(没有 SSL) 连接到非 SSL 端口。
- 如果明文连接成功,则意味着服务器已启动 - 因此问题出在 SSL 证书上。 (如果明文连接也失败,则服务器根本不可用。)
- 向用户显示错误,表明存在 SSL 问题,他们应该检查证书,并提供有关如何手动批准证书的说明。
- 提供一个
target="_blank"
链接到wss://
URL,但将协议替换为https://
。这可能是 Prosody 特定的,但通过访问该 URL,您将看到 SSL 警告页面。 Prosody 将显示以“It Works!”开头的文本。批准证书后 - 如果服务器端是自定义应用程序,您应该显示一条消息“问题已解决,您现在可以关闭此选项卡”。
- 在后台的主应用程序中,每隔几秒不断尝试通过 wss:// 重新连接。一旦连接成功,这意味着用户已经批准了证书。隐藏/删除错误并继续正常的连接/登录过程。
从用户体验角度来看,这远非一个顺利的过程,但这是我发现的最顺利的方法。 iframe 错误页面是不可能的(这是我的第一个想法) - Chrome 将完全拒绝加载它,Firefox 将隐藏“添加例外”按钮,我想其他浏览器也会表现出类似的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)