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

Chrome 52 以降、WebRTC では、証明書(RTCCertificate)の生成に、より効率的で安全なアルゴリズム(ECDSA)が使用されます。また、RTCCertificates を IndexedDB で保存できるようになりました。

RTCCertificates は、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 のもう 1 つの改善点: WebRTC で使用される RTCCertificates を IndexedDB ストレージに保存して読み込むことができるため、セッション間で新しい証明書を生成する必要がなくなります。これは、RSA を引き続き使用する必要があり、RSA 生成のオーバーヘッドを回避したい場合に便利です。ECDSA では、毎回新しい証明書を生成できるほど高速であるため、キャッシュに保存する必要はありません。

RTCCertificate IndexedDB ストレージは、Firefox ですでにリリースされており、Opera 39 にも含まれています。

補足説明