自 Chrome 52 起,WebRTC 會使用效率和安全性都更高的演算法 (ECDSA) 產生憑證 (RTCCertificate)。此外,RTCCertificates 現已可透過 IndexedDB 儲存。
RTC 憑證是指在設定 WebRTC 對等連線時,DTLS 握手程序中使用的自行簽署憑證。(DTLS 是用於資料元協定的密碼編譯通訊協定 TLS 的實作方式,例如 WebRTC 使用的 UDP)。
直到最近,WebRTC 才開始使用 RSA-1024 金鑰建立憑證。這些鍵有幾個缺點:
- 產生 RSA-1024 金鑰可能會使通話建立時間增加約 1000 毫秒。
- 1024 位元 RSA 金鑰無法提供足夠的密碼編譯強度。
由於使用 RSA-1024 產生憑證的速度較慢,因此部分行動應用程式已改為預先準備或重複使用憑證。
您可以使用 2048 位元以上的 RSA 金鑰來解決金鑰強度問題,但這樣會讓通話建立時間延遲數秒。與其變更 RSA 金鑰大小,不如在 Chrome 52 中實作 ECDSA 金鑰 (橢圓曲線數位簽章演算法),以便在憑證中使用。這些金鑰的強度與 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 時,每次產生新的憑證都非常快速,因此不需要快取。
Firefox 和 Opera 39 已提供 RTCCertificate IndexedDB 儲存空間。