Начиная с 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.