Начиная с Chrome 52, WebRTC использует гораздо более эффективный и безопасный алгоритм генерации сертификата (RTCCertificate): ECDSA. Кроме того, сертификаты RTCCertificates теперь можно хранить с помощью IndexedDB.
RTCCertificates — это самозаверяющие сертификаты, используемые при подтверждении связи DTLS при настройке однорангового соединения WebRTC. (DTLS — это реализация криптографического протокола TLS для протоколов датаграмм, таких как UDP , который используется WebRTC.)
До недавнего времени WebRTC использовал для сертификатов ключи RSA-1024. У этих ключей есть несколько недостатков:
- Генерация ключей RSA-1024 может увеличить время установления вызова примерно до 1000 мс.
- 1024-битные ключи RSA не обеспечивают достаточной криптостойкости.
Поскольку создание сертификатов с помощью RSA-1024 происходит медленно, некоторые мобильные приложения прибегают к предварительной подготовке сертификатов или их повторному использованию.
Проблему с надежностью ключа можно решить, перейдя на 2048-битные ключи RSA или более, но это задержит установку вызова на несколько дополнительных секунд. Вместо изменения размера ключа RSA Chrome 52 реализует ключи ECDSA (алгоритм цифровой подписи с эллиптической кривой) для использования в сертификатах. Они так же надежны, как 3072-битные ключи RSA, но в несколько тысяч раз быстрее: затраты на установку вызова с помощью ECDSA составляют всего несколько миллисекунд.
В целом ключи ECDSA означают лучшую безопасность, лучшую конфиденциальность и лучшую производительность, особенно на мобильных устройствах. По этим причинам ECDSA была включена в проект архитектуры безопасности WebRTC .
В Chrome 47 вы можете подключить ECDSA:
// or webkitRTCPeerConnection
RTCPeerConnection.generateCertificate({
name: "ECDSA",
namedCurve: "P-256"
}).then(function(certificate) {
var pc = new RTCPeerConnection({..., certificates: [certificate]});
});
В Chrome 52, хотя ECDSA включен по умолчанию, вы все равно можете создавать сертификаты RSA:
pc.generateCertificate({
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
})
(Дополнительную информацию о generateCertificate()
см. в проекте W3C .)
Хранение RTCCertificate в IndexedDB
Еще одно улучшение в Chrome 52: сертификаты RTCCertificates, используемые WebRTC, можно сохранять и загружать из хранилища IndexedDB, что позволяет избежать необходимости генерировать новые сертификаты между сеансами. Это может быть полезно, например, если вам все еще нужно использовать RSA и вы хотите избежать накладных расходов на генерацию RSA. При использовании ECDSA кэширование не требуется, поскольку оно достаточно быстрое, чтобы каждый раз генерировать новый сертификат.
Хранилище RTCCertificate IndexedDB уже включено в Firefox и находится в Opera 39.