Start · Sprachen · JavaScript · Referenz · RTCCertificateStats.id

RTCCertificateStats.id

Eigenschaft

Ein String, der das Zertifikat-Statistikobjekt in einem <code>RTCStatsReport</code> eindeutig identifiziert und als Schlüssel für Verweise dient.

seit JavaScript Baseline 2023: Chrome, Edge, Firefox, Safari Kategorie: webapi

Signatur

RTCCertificateStats.id

Beschreibung

Die Eigenschaft id des Wörterbuchs RTCCertificateStats ist ein String. Er identifiziert das Zertifikat-Objekt, das dieser Statistik-Eintrag beschreibt, eindeutig. Solche Einträge haben immer den type-Wert "certificate". Sie beschreiben ein Zertifikat, das eine RTCPeerConnection für DTLS verwendet: entweder das eigene (lokale) oder das der Gegenstelle (entfernte).

Die id ist gleichzeitig der Schlüssel des Eintrags in der Map-ähnlichen Struktur RTCStatsReport, die RTCPeerConnection.getStats() liefert. Andere Statistiken verweisen über diese id auf das Zertifikat. Ein RTCTransportStats-Objekt enthält zum Beispiel localCertificateId und remoteCertificateId. Mit report.get(id) kommt man so direkt zum passenden Zertifikat-Eintrag.

Wenn ein Zertifikat von einer Zertifikatskette stammt, verweist issuerCertificateId auf die id des Ausstellerzertifikats. So lässt sich die ganze Kette durchlaufen. Die id selbst ist eine undurchsichtige Kennung, die der Browser vergibt. Man sollte sie nur vergleichen und nachschlagen, aber nicht auswerten.

Rückgabewert

Typ
string
Beschreibung
Eine eindeutige, vom Browser vergebene Kennung des Zertifikat-Statistikobjekts innerhalb des RTCStatsReport.

Beispiele

Alle Zertifikat-Einträge einer Verbindung auflisten

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

const report = await pc.getStats();
report.forEach((stats) => {
  if (stats.type === 'certificate') {
    console.log(`ID: ${stats.id}`);
    console.log(`Fingerprint (${stats.fingerprintAlgorithm}): ${stats.fingerprint}`);
  }
});
ID: CFxx:xx:xx:... Fingerprint (sha-256): 3A:5F:...

Lokales und entferntes Zertifikat über den Transport finden

const logCertificates = async (pc) => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'transport') continue;
    const local = report.get(stats.localCertificateId);
    const remote = report.get(stats.remoteCertificateId);
    console.log('Lokal:', local?.id, local?.fingerprint);
    console.log('Entfernt:', remote?.id, remote?.fingerprint);
  }
};

// Aufruf, nachdem die Verbindung aufgebaut ist:
// await logCertificates(pc);
Lokal: CF3A:5F:... 3A:5F:... Entfernt: CF9B:12:... 9B:12:...

Zertifikatskette über issuerCertificateId durchlaufen

const getCertificateChain = (report, startId) => {
  const chain = [];
  let current = report.get(startId);
  while (current) {
    chain.push(current.id);
    current = current.issuerCertificateId
      ? report.get(current.issuerCertificateId)
      : undefined;
  }
  return chain;
};

// const chain = getCertificateChain(report, transport.remoteCertificateId);
// console.log(chain);
["CF9B:12:..."] // meist nur ein selbstsigniertes Zertifikat

// Wichtig · Fallstricke

  • Das Format der id legt die Spezifikation nicht fest. Chrome nutzt zum Beispiel "CF" plus Fingerprint, Firefox andere Kennungen. Man sollte die id nicht auswerten und sich nicht auf ein bestimmtes Format verlassen.
  • Zertifikat-Einträge tauchen erst auf, wenn ein DTLS-Transport existiert. Das ist frühestens nach setLocalDescription() der Fall, beim entfernten Zertifikat erst nach dem Handshake. Vorher liefert getStats() womöglich keinen Eintrag vom Typ certificate.
  • Die id ist nur innerhalb derselben Verbindung stabil. Über verschiedene RTCPeerConnection-Instanzen oder Browser-Sitzungen hinweg ist sie nicht gleich und eignet sich nicht als dauerhafte Kennung.
  • Die Unterstützung von RTCCertificateStats ist in älteren Browserversionen lückenhaft, vor allem in Safari vor Version 16. Deshalb sollte man optionale Verkettung (?.) nutzen.