WebRTC SUF Sora E2EE¶
概要¶
Sora の E2EE はクライアントから送られてきた暗号化されたメッセージを指定されたクライアントに配信する以外は行わず、 配信以外の処理はすべてクライアントで行われます。
なぜ E2EE なのか¶
Sora にとっての E2EE は「悪意ある管理者」からのクライアントのプライバシーの保護が一番の目的です。
Sora は E2EE を利用しない場合、すべての音声や映像を復号した状態で確認することが可能です。 そのため、悪意ある管理者が存在した場合にクライアントのプライバシーを保護することができません。
Sora の E2EE を利用した場合は「悪意ある管理者」がいたとしても音声や映像を盗み見ることが困難になります。
Sora¶
Sora で E2EE を実現するには Sora 側 sora.conf
にて e2ee = true
と設定する必要があります。
Sora E2EE¶
Wasm バイナリの生成は自前でビルドするか、バイナリをリポジトリからダウンロードします。 ビルドは Go をインストールして make でビルドできます。
Sora JavaScript SDK¶
Sora JavaScript SDK を利用する際にオプションとして {"e2ee": true}
と、
E2EE で利用する wasm ライブラリの URL を渡す {"e2ee_wasm_url": "https://example.com/e2ee/wasm.wasm"}
を指定します。
await Sora.initE2EE("https://example.com/sora-e2ee/2020.3/wasm.wasm")
let conn = Sora.connection('wss://example.com/signaling');
let channelId = 'e2ee-room';
let metadata = null;
let sendrecv = conn.sendrecv(channelId, metadata, {e2ee: true});
navigator.mediaDevices.getUserMedia({audio: true, video: true})
.then(mediaStream => {
// connect
sendrecv.connect(mediaStream)
.then(stream => {
// stream を video.src に追加する等の処理
});
})
.catch(e => {
console.error(e);
});
// disconnect
sendrecv.disconnect()
.then(() => {
// video を止める等の処理
});
// event
sendrecv.on('disconnect', function(e) {
console.error(e);
});
要求¶
Sora 2020.3 以降
Chrome (Edge) M87 以降
Insertable Streams API
Stream API: transferable streams
仕組み¶
クライアント実装¶
Sora の E2EE はすべてクライアント側で実装されています。 サーバ側は E2EE メッセージを配送する仕組みとそのメッセージがクライアント側が正しく送られているかどうかだけをチェックしています。
公開鍵ペアの生成と破棄¶
公開鍵ペアはすべて WebAssembly 側で生成しており、セッションが切断されたタイミングですべての鍵は破棄されます。
公開鍵の登録¶
クライアント側で自分の公開鍵ペアを生成し、公開鍵だけを Sora のシグナリング通知メタデータ機能を利用して登録します。
公開鍵のフィンガープリント取得¶
自分と全員から送られてきた公開鍵のフィンガープリントを取得することが可能です。
これにより相手が Sora が鍵を書き換えていないかどうかを確認することができます。
参加/離脱の通知¶
Sora の シグナリング通知機能 を利用します。
参加時には WebAssembly 内部に保持しているそれぞれの共通鍵をすべて更新し、新規参加者に自分の共通鍵を共有します。
離脱時には残った参加者全員が自分の共通鍵を再生成して共有します。