从 Chrome 52 开始,WebRTC 使用更高效、更安全的算法生成证书 (RTCCertificate):ECDSA。此外,RTCCertificates 现在可以使用 IndexedDB 存储。
RTCCertificates 是设置 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 中的另一项改进:WebRTC 使用的 RTCCertificates 可以保存到 IndexedDB 存储空间并从中加载,这样就无需在会话之间生成新的证书。例如,如果您仍需要使用 RSA 且希望避免 RSA 生成开销,则此方法会很有用。使用 ECDSA 时,无需缓存,因为其速度足够快,可以每次都生成新的证书。
RTCCertificate IndexedDB 存储已在 Firefox 中发布,并在 Opera 39 中提供。