Zum Inhalt springen

Informationen zur Nutzung zum noVNC Websocket

Zuletzt aktualisiert: 04.08.2026

noVNC-Konsole per WebSocket nutzen

Die noVNC-Konsole lässt sich auch außerhalb des Webinterfaces nutzen, etwa für eigene Panels oder Tools. Der Endpunkt akzeptiert WebSocket-Verbindungen auf Port 443:

wss://novnc.datalix.de/websockify

Authentifizierung

Nach dem Verbindungsaufbau muss als erste Nachricht ein JSON-Objekt mit Token und Service-ID gesendet werden:

{"token": "DEIN-TOKEN", "serviceid": "DEINE-SERVICE-ID"}

Als Token kann ein API-Key oder ein Session-Token verwendet werden. Subuser benötigen zusätzlich die Berechtigung "noVNC Konsole". Die Nachricht muss gültiges JSON sein, also doppelte Anführungszeichen verwenden.

Bei Fehlern antwortet der Server mit Error 1 (ungültiges JSON) oder Error 2 (Token ungültig oder kein Zugriff auf den Service) und trennt die Verbindung.

Ablauf nach der Anmeldung

War die Authentifizierung erfolgreich, sendet der Server ein einzelnes Text-Frame mit einem temporären VNC-Passwort (beginnt mit PVEVNC). Ab diesem Punkt ist die Verbindung eine normale VNC-über-WebSocket-Verbindung (RFB-Protokoll, binär). Das Passwort wird im VNC-Handshake verwendet, der Benutzername bleibt leer. Es gilt nur für die aktuelle Verbindung — nach einem Reconnect ist eine neue Authentifizierung nötig.

Das Passwort-Frame gehört nicht zum VNC-Datenstrom und darf nicht an den VNC-Client weitergereicht werden.

Beispiel mit noVNC (ab Version 1.3)

Standard-noVNC sendet das Auth-Paket nicht von selbst. Ab Version 1.3 kann man dem RFB-Konstruktor aber einen bereits offenen WebSocket übergeben und die Authentifizierung vorher selbst erledigen:

import RFB from './core/rfb.js';

const ws = new WebSocket('wss://novnc.datalix.de/websockify', ['binary']);

ws.addEventListener('open', () => {
    ws.send(JSON.stringify({ token: 'DEIN-TOKEN', serviceid: 'DEINE-SERVICE-ID' }));
});

ws.addEventListener('message', function onAuth(e) {
    if (typeof e.data === 'string' && e.data.startsWith('PVEVNC')) {
        ws.removeEventListener('message', onAuth);
        new RFB(document.getElementById('screen'), ws, {
            credentials: { username: '', password: e.data }
        });
    } else if (typeof e.data === 'string' && e.data.startsWith('Error')) {
        console.error('Authentifizierung fehlgeschlagen: ' + e.data);
    }
});

Hinweise

  • Pro Verbindung wird ein neues Einmal-Passwort erzeugt.
  • Der Endpunkt ist auf 30 Verbindungsaufbauten pro Minute und Service begrenzt.