【VNC】【必现】先故意输错一次密码,再次连接控制台报错

// 此模板仅供参考,如果不适用可以修改

问题描述

先故意输错一次密码

再次输入密码

发现控制台报错

VNC无法再次连接

环境信息

openUBMC 25.12

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

[您希望实现什么]

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:
结论:该问题为 前端资源释放缺陷认证状态管理不完善 共同导致的连接异常,建议由前端团队修复 VncH5.js 中的事件监听释放逻辑,并优化认证失败后的连接重置流程。

点击此处查看详细分析解答

VNC 连接失败问题分析与解决方案

问题描述

在使用 openUBMC 系统的 VNC 功能时,若用户首次故意输入错误密码进行连接,随后再次尝试输入正确密码登录,系统会持续报错,无法成功建立 VNC 连接。控制台显示以下错误信息:

Failed when connecting: Security negotiation failed on security result (reason: Authentication failed)
TypeError: o.value.removeAllEventListeners is not a function

此问题在 openUBMC 25.12 版本中可稳定复现。


环境信息

  • 系统版本:openUBMC 25.12
  • VNC 协议:RFB(Remote Framebuffer)
  • 访问方式:通过 Web UI 的 HTML5 VNC 客户端(即 VncH5)
  • 浏览器:Mozilla Firefox 或 Chrome 类浏览器(根据上下文推断)
  • 默认端口:5900(TCP)

重现步骤

  1. 登录 openUBMC Web 界面;
  2. 进入 服务管理 → VNC 页面,确认 VNC 已启用并配置了有效密码;
  3. 在首页点击 HTML5 虚拟控制台 或直接访问 VNC 页面;
  4. 第一次连接时输入错误的 VNC 密码,点击“连接”;
  5. 收到“密码错误或安全验证失败”提示后,重新输入正确的 VNC 密码
  6. 再次点击“连接”。

期望结果

即使首次密码错误,只要第二次输入正确的 VNC 密码,应能正常建立连接并进入远程桌面会话。


实际结果

  • 第二次连接失败;
  • 弹窗提示:“VNC连接失败,密码错误或安全验证失败”;
  • 浏览器开发者工具控制台输出:
    Failed when connecting: Security negotiation failed on security result (reason: Authentication failed)
    TypeError: o.value.removeAllEventListeners is not a function
      at se (VncH5.ac2129f3.js:1:3847)
      at VncH5.ac2129f3.js:1:4742
      ...
    

尝试过的解决方案

  1. 更换浏览器测试
    • 使用 Google Chrome 可能绕过部分前端问题(如 #4 搜索结果显示 Firefox 存在兼容性差异);
    • 在某些情况下,首次接受自签名证书风险后可缓解问题(见搜索结果 #4)。
  2. 清理页面缓存与重载
    • 刷新页面或清除缓存后重新登录可临时恢复功能。
  3. 通过 IP+端口直连测试
    • 尝试访问 https://<BMC_IP>:6100 并接受安全警告(针对 SSL 相关问题,见搜索结果 #4)。

分析结论

1. 认证状态未正确重置导致协议协商失败

根据知识图谱信息:

  • VNC 认证由 bmc.kepler.AccountService.LocalAccountAuthN 中的 VncAuthenticate 方法处理;
  • 该方法仅需 ReadOnly 权限即可执行,但每次认证失败可能未彻底清理会话上下文。

首次认证失败后,BMC 或前端 JavaScript 客户端未正确释放或重置安全协商状态,导致后续认证请求仍携带无效安全上下文,从而引发“Security negotiation failed”。


2. 前端代码存在资源释放缺陷(TypeError 关键线索)

关键错误:

TypeError: o.value.removeAllEventListeners is not a function

此错误表明前端 VNC H5 客户端(VncH5.ac2129f3.js)尝试调用一个对象的 removeAllEventListeners() 方法,但该对象不存在此方法。

根本原因推测

  • 前端 VNC 客户端组件在认证失败后尝试销毁旧连接实例;
  • 但由于对象生命周期管理不当,引用的对象已被销毁或未正确初始化;
  • 导致事件监听器清理失败,进而阻止了新连接的建立。

3. SSL 加密配置影响连接稳定性(潜在因素)

尽管本次问题未明确开启 SSL,但知识图谱指出:

  • BMCSet_VNCSSLEnableState = on 时,仅支持 SSL 加密连接;
  • 非 SSL 客户端需通过 SSL 隧道软件连接(参考 Godzilla 回答);
  • 若前后端对加密模式协商不一致,也可能触发认证失败。

4. 版本特性与前端兼容性问题

  • openUBMC 25.12 使用 HTML5 VNC 客户端(NovNC 或类似技术);
  • 对于 Firefox 浏览器存在已知兼容性问题(见 #4);
  • 虽然 Chrome 可正常工作,但错误处理机制仍存在缺陷,未能优雅处理认证失败后的重连流程。

建议解决方案

:white_check_mark: 短期缓解措施

  1. 刷新页面后再重试
    • 每次密码错误后手动刷新浏览器页面,确保前端状态重置;
  2. 优先使用 Chrome 浏览器
  3. 关闭 SSL 加密(如非必要)
    • 进入 服务管理 → VNC → SSL加密 设置为关闭,降低连接复杂度。

:hammer_and_wrench: 长期修复建议

  1. 前端修复(VncH5.js)

    • 在连接失败时,增加对 removeAllEventListeners 方法存在的判断:
      if (o.value && typeof o.value.removeAllEventListeners === 'function') {
          o.value.removeAllEventListeners();
      }
      
    • 确保每次连接前销毁旧实例并创建新 VNC 客户端对象。
  2. 后端认证状态清理优化

    • VncAuthenticate 失败时,主动清除关联的会话状态;
    • 防止残留状态影响后续连接。
  3. 增强错误提示与恢复机制

    • 区分“密码错误”与“安全协商失败”,向用户提供更明确的指导;
    • 提供“重置连接”按钮而非依赖刷新页面。

参考资料依据

  • VncAuthenticate 方法权限与调用逻辑 —— 来自 KG 实体及文档 chunk 3;
  • HTML5 VNC 客户端行为 —— 搜索结果 #1、#4
  • SSL 加密要求与客户端兼容性 —— Godzilla 回复(Document 2);
  • 前端 JS 错误模式 —— Document 4 与当前问题日志一致;
  • VNC H5 页面实现方式 —— 关系 "HTML5 VNC" -> "VNC"

结论:该问题为 前端资源释放缺陷认证状态管理不完善 共同导致的连接异常,建议由前端团队修复 VncH5.js 中的事件监听释放逻辑,并优化认证失败后的连接重置流程。

根因:RFB开源库中没有removeAllEventListeners函数

如下修改就可以了