RTCCertificate: Methode getFingerprints()
Baseline 2025>
Neu verfügbar
Seit April 2025 funktioniert diese Funktion auf aktuellen Geräten und in aktuellen Browserversionen. Auf älteren Geräten oder in älteren Browsern funktioniert sie möglicherweise nicht.
Die Methode getFingerprints() der Schnittstelle RTCCertificate wird verwendet, um ein Array von Zertifikat-Fingerprints abzurufen.
Dies kann in Code auf Anwendungsebene verwendet werden, um Zertifikat-Fingerprints abzurufen. Dabei handelt es sich um Hashes des Zertifikats, die mithilfe der verschiedenen vom Browser unterstützten Algorithmen erstellt werden.
Syntax
getFingerprints()
Parameter
Keine.
Rückgabewert
Ein Array von Fingerprint-Werten. Jeder Fingerprint wird durch ein Objekt mit den folgenden Eigenschaften dargestellt:
algorithm-
Ein String, der den Hash-Funktionsalgorithmus angibt, der verwendet wurde, um den Fingerprint in
valuezu erstellen. Zulässige Werte sind unter anderem:"sha-1","sha-224","sha-256","sha-384","sha-512","md5","md2". value-
Ein String, der den Zertifikat-Fingerprint als hexadezimalen String in Kleinbuchstaben enthält, berechnet mit der Hash-Funktion
algorithm. Das Format ist in RFC4572, Abschnitt 5 genauer definiert.
Beschreibung
Die für eine bestimmte RTCPeerConnection verwendeten RTCCertificate-Instanzen können mithilfe der statischen Methode RTCPeerConnection.generateCertificate() erstellt oder aus einem IndexedDB-Speicher abgerufen und im Konstruktor festgelegt werden.
Wenn im Konstruktor keine Zertifikate übergeben werden, werden sie automatisch erstellt. In diesem Fall können die verwendeten Zertifikate mit RTCPeerConnection.getConfiguration() abgerufen werden.
Browser tauschen während der SDP-Angebotsphase automatisch die mit jeder RTCPeerConnection verknüpften Zertifikate und Fingerprints aus. Diese werden als Teil des DTLS-Handshakes verwendet, um zu überprüfen, ob die Gegenstelle mit dem im SDP gesendeten Zertifikat/Endpunkt übereinstimmt.
Dies stellt eine Validierung auf niedriger Ebene bereit, dass die WebRTC-Kommunikation mit der Gegenstelle aufgebaut wird, die das Angebot initiiert hat, bietet jedoch beispielsweise keine Validierung der Identität der kommunizierenden Benutzer.
In einigen Fällen kann es für die Anwendungsebene nützlich sein, Zertifikat-Fingerprints außerhalb des üblichen Kommunikationswegs auszutauschen:
- Wenn zwischen zwei Webbrowsern eine Vertrauensbeziehung hergestellt wurde, kann sie durch das Speichern der Zertifikate und deren Wiederverwendung in einer späteren Sitzung persistiert werden (bis zu einem Jahr später). Die vertrauenswürdigen Zertifikate werden anhand ihrer Fingerprints identifiziert.
- Peers, die einen bestimmten Benutzer identifizieren möchten, können Fingerprints senden und den zugehörigen Benutzer „out of band“ validieren (d.h. außerhalb des vom Browser vermittelten WebRTC-Kommunikationsflusses). Die Anwendung kann den Fingerprint verwenden, um spätere Sitzungen mit dem jeweiligen Benutzer zu identifizieren.
- In einigen Implementierungen von Konferenzservern („Middleboxes“) muss der Server möglicherweise die Fingerprints kennen, bevor ein Angebot/eine Antwort verarbeitet wird.
Peers können unterschiedliche Mengen an Algorithmen unterstützen. Beim Vergleichen von Zertifikaten sollten alle Fingerprint-Werte für die von Peers unterstützte Menge von Algorithmen übereinstimmen.
Beispiele
>Abrufen von Zertifikat-Fingerprints
Dieses Beispiel zeigt, wie Sie Zertifikat-Fingerprints vom lokalen Peer abrufen und mit Fingerprints vom Remote-Peer vergleichen können.
Zuerst erstellen wir eine Verbindung und rufen Zertifikate sowie deren Fingerprints ab. Die Fingerprints vom Remote-Peer erhalten wir über „einen Out-of-Band-Mechanismus“.
// Get the certificate fingerprints from the local peer.
const rtcPeerConnection = new RTCPeerConnection();
const configuration = rtcPeerConnection.getConfiguration();
const certificates = configuration.certificates;
let fingerprintsFromClient;
if (certificates && certificates.length > 0) {
for (const cert of certificates) {
// For purpose of demonstration, just get first certificate
fingerprintsFromClient = cert.getFingerprints();
break;
}
}
// Get the certificate fingerprints from the remote peer for particular certificate (pseudo code)
const fingerprintsFromServer = [/* … */];
Es gibt zahlreiche Möglichkeiten, die Fingerprint-Arrays für ein bestimmtes Zertifikat zu vergleichen. Hier konvertieren wir die Arrays in Wörterbuchobjekte, bei denen der Algorithmusname die Eigenschaft ist, und vergleichen sie anschließend. Dies funktioniert, weil für jeden Algorithmus nur ein Fingerprint-Wert vorhanden sein kann. (Es gibt viele weitere Möglichkeiten, die beiden Arrays zu sortieren und zu vergleichen.)
let clientFingerprintDict = Object.fromEntries(
fingerprintsFromClient.map((x) => [x.algorithm, x.value]),
);
let serverFingerprintDict = Object.fromEntries(
fingerprintsFromServer.map((x) => [x.algorithm, x.value]),
);
// Function to compare two objects and return true if there are common properties
// and all common properties match.
function compareObjects(obj1, obj2) {
const commonProperties = Object.keys(obj1).filter((prop) =>
Object.hasOwn(obj2, prop),
);
// Return false if there are no common properties
if (Object.keys(commonProperties).length === 0) return false;
// Return false if any common properties don't match
for (const prop of commonProperties) {
if (obj1[prop] !== obj2[prop]) {
return false;
}
}
return true;
}
const matchingFingerprints = compareObjects(
clientFingerprintDict,
serverFingerprintDict,
);
console.log(matchingFingerprints);
Spezifikationen
| Spezifikation |
|---|
| WebRTC: Real-Time Communication in Browsers> # dom-rtccertificate-getfingerprints> |