Signatur
Beschreibung
Die schreibgeschützte Eigenschaft issuerCertificateId des Wörterbuchs RTCCertificateStats verweist auf das Zertifikat, das das aktuelle Zertifikat ausgestellt hat. Sie enthält die id eines weiteren RTCCertificateStats-Eintrags im selben RTCStatsReport. So lässt sich eine Zertifikatskette vom Blatt-Zertifikat bis zum obersten Zertifikat Schritt für Schritt verfolgen.
Die Zertifikats-Statistiken bekommt man über RTCPeerConnection.getStats(). Ein Eintrag mit type === "certificate" steht für ein DTLS-Zertifikat, das ein Transport verwendet (lokal oder entfernt). Welche Zertifikate zu einem Transport gehören, erfährt man über RTCTransportStats.localCertificateId und remoteCertificateId.
In WebRTC sind Zertifikate meist selbstsigniert, zum Beispiel wenn sie mit RTCPeerConnection.generateCertificate() erzeugt wurden. Dann gibt es keine Kette, und issuerCertificateId ist undefined. Die Eigenschaft hat nur dann einen Wert, wenn die Gegenseite eine echte Kette mit mehreren Zertifikaten übermittelt.
Rückgabewert
id des RTCCertificateStats-Objekts für das Aussteller-Zertifikat. Ist das Zertifikat selbstsigniert oder das letzte der Kette, ist der Wert undefined, denn die Eigenschaft fehlt dann im Objekt.Beispiele
Aussteller-Verweis eines Zertifikats auslesen
const pc = new RTCPeerConnection();
// ... Verbindung aufbauen (Angebot, Antwort, ICE) ...
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === "certificate") {
console.log(stats.id, "→ Aussteller:", stats.issuerCertificateId ?? "keiner (selbstsigniert)");
}
});
Vollständige Zertifikatskette des entfernten Partners ablaufen
const getRemoteCertChain = async (pc) => {
const report = await pc.getStats();
const transport = [...report.values()].find((s) => s.type === "transport");
if (!transport?.remoteCertificateId) return [];
const chain = [];
const seen = new Set();
let certId = transport.remoteCertificateId;
// Der Kette folgen, bis kein Aussteller mehr angegeben ist
while (certId && !seen.has(certId)) {
seen.add(certId);
const cert = report.get(certId);
if (!cert) break;
chain.push({
fingerprint: cert.fingerprint,
algorithm: cert.fingerprintAlgorithm
});
certId = cert.issuerCertificateId;
}
return chain;
};
const chain = await getRemoteCertChain(pc);
console.log(`Kettenlänge: ${chain.length}`, chain);
Prüfen, ob ein Zertifikat selbstsigniert ist
const isSelfSigned = (certStats) => certStats.issuerCertificateId === undefined;
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === "certificate") {
console.log(stats.fingerprint, isSelfSigned(stats) ? "selbstsigniert" : "hat Aussteller");
}
}
// Wichtig · Fallstricke
- Meist
undefined: WebRTC-Zertifikate sind in der Regel selbstsigniert. Prüfen Sie den Wert deshalb immer, bevor Sie ihn verwenden, etwa mit??oder optionalem Verketten. - Die
idgilt nur innerhalb desselbenRTCStatsReport. Schlagen Sie sie mitreport.get(id)im selben Bericht nach. Verweise zwischen verschiedenengetStats()-Aufrufen sind nicht garantiert gleich. - Die Zertifikats-Statistiken sind erst verfügbar, nachdem der DTLS-Handshake abgeschlossen ist. Vorher fehlen die Einträge mit
type: "certificate". - Wenn Sie der Kette in einer Schleife folgen, sollten Sie bereits besuchte IDs merken. Das schützt vor Endlosschleifen, falls Daten fehlerhaft sind.
- Browser-Kompatibilität: Die Eigenschaft wird von aktuellen Versionen von Chromium, Firefox und Safari unterstützt. Ältere Browser liefern sie womöglich nicht, auch wenn eine Kette vorhanden ist.