Chrome 52 以降、WebRTC では証明書(RTCCertificate)生成に効率的で安全なアルゴリズムである ECDSA が使用されます。また、RTCCertificates を IndexedDB に保存できるようになりました。
RTCCertificate は、WebRTC ピア接続をセットアップするときに DTLS handshake で使用される自己署名証明書です。(DTLS は、WebRTC で使用されている UDP などのデータグラム プロトコル用の暗号プロトコル TLS の実装です)。
最近まで、WebRTC では証明書に RSA-1024 鍵が使用されていました。これらのキーには、いくつかの欠点があります。
- RSA-1024 鍵を生成すると、通話のセットアップ時間が 1,000 ミリ秒ほどかかることがあります。
- 1,024 ビットの RSA 鍵では、暗号化強度が十分ではありません。
RSA-1024 を使用した証明書の生成には時間がかかるため、一部のモバイルアプリでは、事前に証明書を準備したり、再利用したりしています。
鍵の強度の問題は、2, 048 ビットの RSA 鍵以上にすることで解決できますが、その場合、通話の設定が数秒遅れます。Chrome 52 では、RSA 鍵のサイズを変更する代わりに、証明書で使用する ECDSA 鍵(楕円曲線デジタル署名アルゴリズム)が実装されています。この鍵は 3,072 ビットの 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 のドラフトをご覧ください)。
RTCCertificate を IndexedDB に保存する
Chrome 52 のもう一つの改善点として、WebRTC で使用される RTCCertificate を IndexedDB ストレージから保存および読み込みできるようになったため、セッション間で新しい証明書を生成する必要がなくなります。これは、まだ RSA を使用する必要があり、RSA 生成のオーバーヘッドを回避したい場合などに役立ちます。ECDSA では、毎回新しい証明書を生成できるほど高速なので、キャッシュ保存は必要ありません。
RTCCertificate IndexedDB ストレージは、すでに Firefox でリリースされており、Opera 39 で提供されています。