ssl - 为什么我的wss ://(WebSockets over SSL/TLS) connection immediately disconnect without giving any errors?

标签 ssl websocket xmpp

将此发布给遇到相同问题的其他人。

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

没有错误日志、没有错误代码、没有确认对话框或确认栏,也没有任何可能出错的迹象。

最佳答案

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

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

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

  1. 如果 WebSocket 在收到登录确认(特定于 XMPP)之前断开连接,请尝试建立明文 ws://(无 SSL)连接非 SSL 端口。
  2. 如果明文连接成功,这意味着服务器已启动 - 因此问题出在 SSL 证书上。 (如果明文连接也失败,则服务器根本不可用。)
  3. 向用户显示错误,表明存在 SSL 问题,他们应该检查证书,并说明如何手动批准证书。
  4. 提供指向 wss:// URL 的 target="_blank" 链接,但将协议(protocol)替换为 https://。这可能是特定于韵律的,但通过访问该 URL,您将看到 SSL 警告页面。 Prosody 将显示以“It works!”开头的文本。批准证书后 - 如果服务器端是自定义应用程序,您应该显示一条消息说“问题已解决,您现在可以关闭此选项卡”。
  5. 在后台,在主应用程序中,每隔几秒尝试通过 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/

相关文章:

ssl - 无法使用 Nexus 通过 https/ssl 代理 Maven 存储库

node.js - NodeJS WebSocket 握手静默失败?

ssl - 安全的 WebSockets wss 是否为 ://protocol encrypt client-to-server data?

Python gtalk 客户端代码不工作

javascript - 将 SSL 添加到域时,Flex Slider 不工作

在 Windows 上使用 lftp 进行 git ftp 推送

php - SIP2 不支持 php 中的 TLS1.2 协议(protocol)

jsf - 在 JSF 2.3 中通知用户 session 结束

android - 如何从Openfire获取群聊的离线消息

java - Xmpp 与 Websocket