【问题标题】:noVNC connecting to VNCServer on private LAN using HTTPS onlynoVNC 仅使用 HTTPS 连接到专用 LAN 上的 VNCServer
【发布时间】:2011-04-19 22:00:13
【问题描述】:

不确定我是否真的是最新的,但我正在寻找一种方法来将我现有的项目转换为使用 HTML5 websockets。

这是我的情况:

- Client runs a modified java vnc applet with extra parameter (CONNECT).

- Modified stunnel listenin on webserver (with both public, private IP) port 443

- Client connects to 443 and sends (prior to RFB) a HTTP packet like :
  'CONNECT 10.0.0.1:4001'

- Stunnel opens a new stream to 10.0.0.1:4001 using SSL wrapper

- VNC Server (@10.0.0.1:4001) responds, connection is established.

现在我想摆脱 Java Applet 并使用 NoVNC 切换到 Websocket。

我希望能够:

- Open a single port on the webserver (HTTPS preferably)
- Have client connect using HTML5 only (no more java applet)

我无法改变:

- VNCServer will still be listening on private LAN only.
- VNCServer will still listen to a bunch of ports, each corresponding to
  a virtual server

问题是:

- How to give NoVNC the notion of target HOST:PORT ?
- Is stunnel still be usable ? Or should I change to websocket proxy ?

如果有人有一个起点,我真的很感激!

【问题讨论】:

    标签: ssl websocket vnc vnc-server


    【解决方案1】:

    免责声明:我创建了 noVNC,所以我的回答可能有很大的偏见;-)

    我会先回答你第二个问题

    noVNC 不能直接使用 stunnel。问题是 WebSockets 协议有一个类似 HTTP 的初始握手,并且消息是框架的。此外,在向 WebSockets 添加二进制负载支持之前,负载是由 websockets 代理 (websockify) 进行 base64 编码的。为 stunnel 添加必要的支持并非易事,但肯定是可行的。事实上,noVNC issue #37 是一个理想的功能,可以将此支持添加到 stunnel。

    第一个问题

    noVNC 已经通过RFB.connect(host, port, password) 方法有了 HOST:PORT 的概念。顶层文件vnc_auto.html 展示了如何让 noVNC 根据指定为 URL 查询字符串参数的主机、端口和密码在页面加载时自动连接。

    但是,我认为您真正要问的是如何让 noVNC 连接到后端的备用 VNC 服务器端口。 noVNC 和 websockify 没有直接解决这个问题。有几种方法可以解决这个问题,它通常涉及带外设置/授权机制,因此代理不能用于发起任意主机的攻击。例如,在我的公司,我们有一个基于 Web 的管理框架,它集成了 noVNC,当用户想要连接到控制台时,一个经过身份验证的 AJAX 调用用于为该特定用户和他们想要连接的系统配置代理。我们的网络管理界面仅供内部使用。

    Ganeti Web Manager 使用类似的模型,并且源代码可用。他们有一个支持 WebSockets 的 VNCAuthProxy 的分支。他们使用从 Web 界面到 VNCAuthProxy 的控制通道来设置与特定 VNC 服务器 host:port 关联的临时密码。

    OpenStack (Nova) 还集成了 noVNC 使用类似的基于带外令牌的模型来允许使用他们的 nova-vncproxy 进行访问。

    一些链接:

    【讨论】:

    • 感谢您提供出色而完整的答案(像往常一样)。我对 python 世界很陌生,所有这些资源,尤其是 nova,似乎都与框架深度集成;因此,我无法“轻松”地摆脱它。尝试了 VNCAuthProxy 但也无法运行(请参阅code.osuosl.org/issues/4101)。
    • 我一定遗漏了一些非常明显的东西,但不知道是什么。此外,如果有人可以编写一个“开箱即用”的解决方案,任何人都可以在他们的内部项目中使用(没有专家 python 技能),那也太好了。很高兴你能帮助我:)
    • @Disco,是的,主机:端口选择与身份验证/授权密切相关。如果您有很多 VNC 服务器,那么您可能有某种框架或系统用于管理它们。 noVNC 连接到这些系统的设置/授权应链接到该框架。如果你只有几个 VNC 服务器,那么你可以为它们启动几个 websockify 实例。您可能处于想要一些 websockify 自动化但没有框架的中间位置。在下一条评论中继续...
    • ... 继续。我做了一个快速而肮脏的补丁,可能会做你想做的事。它允许目标端口作为 WebSockets 握手的一部分(在路径中)传递,并将端口限制在 5900-5999 范围内。我不会将其提交给主流,因为这会引发一些安全问题,您需要小心,但它可能对您有用:gist.github.com/928289
    猜你喜欢
    • 2017-10-28
    • 2021-09-12
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2014-03-03
    • 2015-07-25
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多