Od wersji 52 Chrome WebRTC używa znacznie wydajniejszego i bezpieczniejszego algorytmu do generowania certyfikatów (RTCCertificate): ECDSA. Dodatkowo certyfikaty RTC mogą być teraz przechowywane w IndexedDB.
RTCCertificates to samodzielnie podpisane certyfikaty używane w uzgadnianiu DTLS podczas konfigurowania połączenia peer-to-peer WebRTC. (DTLS to implementacja protokołu kryptograficznego TLS dla protokołów pakietów danych, takich jak UDP, który jest używany przez WebRTC).
Do niedawna WebRTC używało kluczy RSA-1024 do certyfikatów. Te klucze mają kilka wad:
- Generowanie kluczy RSA-1024 może wydłużyć czas konfiguracji połączenia o około 1000 ms.
- Klucze RSA o długości 1024 bitów nie zapewniają odpowiedniej siły kryptograficznej.
Generowanie certyfikatów za pomocą RSA-1024 jest powolne, dlatego niektóre aplikacje mobilne przygotowują certyfikaty z wyprzedzeniem lub używają ich ponownie.
Problem z siłą klucza można rozwiązać, przechodząc na klucze RSA o długości co najmniej 2048 bitów, ale spowoduje to opóźnienie konfiguracji połączenia o kilka dodatkowych sekund. Zamiast zmieniać rozmiar klucza RSA, Chrome 52 implementuje klucze ECDSA (algorytm podpisu cyfrowego wykorzystujący krzywe eliptyczne) do użycia w certyfikatach. Są one tak samo silne jak klucze RSA o długości 3072 bitów, ale kilka tysięcy razy szybsze: czas konfiguracji połączenia przy użyciu ECDSA wynosi tylko kilka milisekund.
Podsumowując, klucze ECDSA oznaczają lepsze bezpieczeństwo, większą prywatność i lepszą wydajność, zwłaszcza na urządzeniach mobilnych. Z tych powodów w projektie architektury bezpieczeństwa WebRTC wymagano użycia algorytmu ECDSA.
W Chrome 47 możesz włączyć ECDSA:
// or webkitRTCPeerConnection
RTCPeerConnection.generateCertificate({
name: "ECDSA",
namedCurve: "P-256"
}).then(function(certificate) {
var pc = new RTCPeerConnection({..., certificates: [certificate]});
});
Od wersji 52 Chrome, mimo że ECDSA jest domyślnie włączona, nadal możesz generować certyfikaty RSA:
pc.generateCertificate({
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
})
(więcej informacji o generateCertificate()
znajdziesz w wersji roboczej W3C).
Przechowywanie RTCCertificate w IndexedDB
Kolejna poprawa w Chrome 52: certyfikaty RTC używane przez WebRTC można zapisywać i wczytywać z magazynu IndexedDB, dzięki czemu nie trzeba generować nowych certyfikatów między sesjami. Może to być przydatne, jeśli nadal musisz używać RSA i chcesz uniknąć nakładów związanych z generowaniem tego formatu. W przypadku ECDSA nie jest konieczne używanie pamięci podręcznej, ponieważ generowanie nowego certyfikatu jest na tyle szybkie, że można to robić za każdym razem.
Pamięć IndexedDB RTCCertificate jest już dostępna w Firefox i Opera 39.