WebRTC 向け ECDSA - セキュリティ、プライバシー、パフォーマンスの向上

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 で提供されています。

補足説明