Start · Sprachen · JavaScript · Referenz · RTCIceParameters.password

RTCIceParameters.password

Eigenschaft

Enthält das ICE-Passwort (<code>ice-pwd</code>). Zusammen mit <code>usernameFragment</code> kennzeichnet es eine ICE-Sitzung eindeutig, solange sie besteht.

seit JavaScript WebRTC 1.0; Chrome/Edge und Safari. In Firefox feh Kategorie: webapi

Signatur

RTCIceParameters.password

Beschreibung

Die Eigenschaft password gehört zum Wörterbuch RTCIceParameters. Sie enthält das ICE-Passwort einer ICE-Sitzung. Dieser Wert steht in der SDP-Beschreibung als Attribut a=ice-pwd. Bei STUN-Verbindungsprüfungen (Connectivity Checks) dient er als Schlüssel für die Nachrichtenintegrität (MESSAGE-INTEGRITY). Die Gegenstelle kann so prüfen, ob eine Prüfanfrage wirklich vom ausgehandelten Partner stammt.

Ein RTCIceParameters-Objekt erzeugt man nicht selbst. Man erhält es über RTCIceTransport.getLocalParameters() (eigene Seite) oder RTCIceTransport.getRemoteParameters() (Gegenstelle). Das zugehörige RTCIceTransport erreicht man zum Beispiel über RTCRtpSender.transport.iceTransport oder RTCPeerConnection.sctp.transport.iceTransport.

Das Passwort bleibt gleich, solange die ICE-Sitzung besteht. Es ändert sich nur bei einem ICE-Neustart (restartIce() oder createOffer({ iceRestart: true })). Deshalb eignet sich der Wert gut für Diagnosezwecke, zum Beispiel um einen erfolgten ICE-Neustart zu erkennen.

Rückgabewert

Typ
string
Beschreibung
Das ICE-Passwort als Zeichenkette. Laut ICE-Spezifikation (RFC 8839) besteht es aus 22 bis 256 Zeichen aus dem ice-char-Zeichensatz (Buchstaben, Ziffern, + und /). Solange noch keine Parameter vorliegen, gibt getRemoteParameters() null zurück; dann gibt es auch kein password.

Beispiele

Lokales ICE-Passwort nach der Aushandlung auslesen

const pc = new RTCPeerConnection();
pc.createDataChannel('chat');

const offer = await pc.createOffer();
await pc.setLocalDescription(offer);

// ICE-Transport über den SCTP-Transport des Datenkanals holen
const iceTransport = pc.sctp?.transport.iceTransport;
const params = iceTransport?.getLocalParameters();

if (params) {
  console.log('ufrag:', params.usernameFragment);
  console.log('Passwortlänge:', params.password.length);
} else {
  console.log('ICE-Parameter noch nicht verfügbar');
}
ufrag: aB3x Passwortlänge: 24

Passwort mit dem a=ice-pwd-Attribut der SDP vergleichen

const getSdpIcePwd = (sdp) => sdp.match(/^a=ice-pwd:(\S+)/m)?.[1] ?? null;

const checkIcePwd = (pc) => {
  const [sender] = pc.getSenders();
  const iceTransport = sender?.transport?.iceTransport;
  const local = iceTransport?.getLocalParameters();
  const sdpPwd = getSdpIcePwd(pc.localDescription?.sdp ?? '');
  console.log('Stimmt überein:', local?.password === sdpPwd);
};

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
stream.getTracks().forEach((t) => pc.addTrack(t, stream));
await pc.setLocalDescription(await pc.createOffer());
checkIcePwd(pc);
Stimmt überein: true

ICE-Neustart anhand des Remote-Passworts erkennen

const watchIceRestart = (iceTransport) => {
  let lastPwd = iceTransport.getRemoteParameters()?.password ?? null;

  iceTransport.addEventListener('statechange', () => {
    const pwd = iceTransport.getRemoteParameters()?.password ?? null;
    if (pwd && lastPwd && pwd !== lastPwd) {
      console.log('Gegenstelle hat einen ICE-Neustart durchgeführt');
    }
    lastPwd = pwd;
  });
};

// Nutzung, sobald eine Verbindung besteht:
// watchIceRestart(pc.getSenders()[0].transport.iceTransport);
Gegenstelle hat einen ICE-Neustart durchgeführt

// Wichtig · Fallstricke

  • Sicherheit: Das ICE-Passwort sichert die STUN-Verbindungsprüfungen. Es gehört nicht in Logs, Analyse-Dienste oder öffentliche Fehlerberichte. Über den Signalisierungskanal muss es zwar übertragen werden, dieser Kanal sollte aber verschlüsselt sein (HTTPS/WSS).
  • Nur lesbar: RTCIceParameters ist ein Wörterbuch mit einem Momentaufnahme-Wert. Wer die Eigenschaft ändert, beeinflusst die laufende Verbindung nicht. Ein neues Passwort bekommt man nur über einen ICE-Neustart (pc.restartIce()).
  • Zeitpunkt: Vor setLocalDescription() bzw. setRemoteDescription() ist oft noch kein transport vorhanden. Außerdem kann getRemoteParameters() null zurückgeben. Optional Chaining (?.) verwenden.
  • Bündelung: Bei bundlePolicy: 'max-bundle' teilen sich alle Sender dasselbe RTCIceTransport und damit dasselbe Passwort.
  • Kompatibilität: RTCIceTransport.getLocalParameters() und getRemoteParameters() gibt es in Chromium-Browsern und Safari. In Firefox fehlt die Unterstützung teilweise. Als Ausweichlösung lässt sich a=ice-pwd aus der SDP lesen.