从 Chrome 52 开始,WebRTC 使用更高效、更安全的算法 (RTCCertificate) 生成证书:ECDSA。此外,RTCCertificate 现在可以使用 IndexedDB 进行存储。
RTCCertificate 是设置 WebRTC 对等连接时在 DTLS 握手中使用的自签名证书。(DTLS 是 WebRTC 使用的 UDP 等数据报协议的加密协议 TLS 的实现)。
不久之前,WebRTC 一直使用 RSA-1024 密钥作为证书。这些键存在一些缺点:
- 生成 RSA-1024 密钥会增加大约 1000 毫秒的通话设置时间。
- 1024 位 RSA 密钥的加密强度不足。
由于使用 RSA-1024 生成证书的速度很慢,因此某些移动应用会提前准备证书或重复使用证书。
使用 2048 位或更多 RSA 密钥可以解决密钥强度问题,但这会额外延迟几秒通话设置。Chrome 52 采用的是在证书中使用的 ECDSA 密钥(椭圆曲线数字签名算法),而不是更改 RSA 密钥大小。这些密钥与 3072 位 RSA 密钥一样强,但速度要快几千倍:使用 ECDSA 的通话设置开销只有几毫秒。
总而言之,ECDSA 密钥意味着更高的安全性、更好的隐私保护和更好的效果,尤其是在移动设备上。出于这些原因,WebRTC 安全架构草案已规定使用 ECDSA。
从 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 草稿。)
在 IndexedDB 中存储 RTCCertificate
Chrome 52 中的另一项改进:可以从 IndexedDB 存储空间保存和加载 WebRTC 使用的 RTCCertificate,从而避免在会话之间生成新证书。在某些情况下(例如,如果您仍需要使用 RSA 并且希望避免 RSA 生成开销),这种做法会非常有用。使用 ECDSA 时,无需进行缓存,因为缓存速度足够快,每次都能生成新证书。
RTCCertificate IndexedDB 存储已在 Firefox 中和 Opera 39 中推出。