Signatur
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
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}`);
}
});
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);
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);
// Wichtig · Fallstricke
- Das Format der
idlegt die Spezifikation nicht fest. Chrome nutzt zum Beispiel"CF"plus Fingerprint, Firefox andere Kennungen. Man sollte dieidnicht 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 liefertgetStats()womöglich keinen Eintrag vom Typcertificate. - Die
idist nur innerhalb derselben Verbindung stabil. Über verschiedeneRTCPeerConnection-Instanzen oder Browser-Sitzungen hinweg ist sie nicht gleich und eignet sich nicht als dauerhafte Kennung. - Die Unterstützung von
RTCCertificateStatsist in älteren Browserversionen lückenhaft, vor allem in Safari vor Version 16. Deshalb sollte man optionale Verkettung (?.) nutzen.