Signatur
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
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');
}
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);
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);
// 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:
RTCIceParametersist 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 keintransportvorhanden. Außerdem kanngetRemoteParameters()nullzurückgeben. Optional Chaining (?.) verwenden. - Bündelung: Bei
bundlePolicy: 'max-bundle'teilen sich alle Sender dasselbeRTCIceTransportund damit dasselbe Passwort. - Kompatibilität:
RTCIceTransport.getLocalParameters()undgetRemoteParameters()gibt es in Chromium-Browsern und Safari. In Firefox fehlt die Unterstützung teilweise. Als Ausweichlösung lässt sicha=ice-pwdaus der SDP lesen.