Ab Chrome 52 verwendet WebRTC einen viel effizienteren und sichereren Algorithmus für die Zertifikatsgenerierung (RTCCertificate): ECDSA. Außerdem können RTCCertificates jetzt mit IndexedDB gespeichert werden.
RTCCertificates sind die selbst signierten Zertifikate, die beim DTLS-Handshake beim Einrichten einer WebRTC-Peer-Verbindung verwendet werden. (DTLS ist eine Implementierung des kryptografischen Protokolls TLS für Datagrammprotokolle wie UDP, das von WebRTC verwendet wird.)
Bis vor Kurzem wurden in WebRTC RSA-1024-Schlüssel für Zertifikate verwendet. Diese Schlüssel haben mehrere Nachteile:
- Das Generieren von RSA-1024-Schlüsseln kann die Anruf-Setup-Zeit um bis zu etwa 1.000 ms verlängern.
- 1024-Bit-RSA-Schlüssel bieten keine ausreichende kryptografische Stärke.
Da die Zertifikatsgenerierung mit RSA-1024 langsam ist, bereiten einige mobile Apps Zertifikate im Voraus vor oder verwenden sie wieder.
Das Problem mit der Schlüsselstärke könnte durch die Verwendung von RSA-Schlüsseln mit 2.048 Bit oder mehr behoben werden, dies würde die Anrufeinrichtung jedoch um mehrere zusätzliche Sekunden verzögern. Anstatt die RSA-Schlüsselgröße zu ändern, werden in Chrome 52 ECDSA-Schlüssel (Elliptic Curve Digital Signature Algorithm) für die Verwendung in Zertifikaten implementiert. Sie sind so sicher wie 3.072-Bit-RSA-Schlüssel, aber um ein Vielfaches schneller: Der Aufwand für die Anrufeinrichtung mit ECDSA beträgt nur wenige Millisekunden.
Insgesamt bieten ECDSA-Schlüssel mehr Sicherheit, mehr Datenschutz und eine bessere Leistung – insbesondere auf Mobilgeräten. Aus diesen Gründen ist ECDSA im Entwurf der WebRTC Security Architecture vorgeschrieben.
Ab Chrome 47 können Sie ECDSA aktivieren:
// or webkitRTCPeerConnection
RTCPeerConnection.generateCertificate({
name: "ECDSA",
namedCurve: "P-256"
}).then(function(certificate) {
var pc = new RTCPeerConnection({..., certificates: [certificate]});
});
Ab Chrome 52 ist ECDSA zwar standardmäßig aktiviert, Sie können aber weiterhin RSA-Zertifikate generieren:
pc.generateCertificate({
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
})
Weitere Informationen zu generateCertificate() finden Sie im W3C-Entwurf.
RTCCertificate in IndexedDB speichern
Eine weitere Verbesserung in Chrome 52: Die von WebRTC verwendeten RTCCertificates können im IndexedDB-Speicher gespeichert und geladen werden. So müssen zwischen Sitzungen keine neuen Zertifikate generiert werden. Dies kann beispielsweise nützlich sein, wenn Sie RSA weiterhin verwenden müssen und den RSA-Generierungsaufwand vermeiden möchten. Bei ECDSA ist das Caching nicht erforderlich, da es schnell genug ist, um jedes Mal ein neues Zertifikat zu generieren.
Die IndexedDB-Speicherung von RTCCertificate wurde bereits in Firefox eingeführt und ist in Opera 39 verfügbar.