- RFC4145でTCPにしか触れてなかった
- でも実際はセキュアにメディア転送したいはず
- なので今回TLSを使用できる拡張を行う
- 自己証明書でFingerprintを生成し、それをSDPに載せる
- RFC4572からのアップデート
- 後方互換性は保ちつつ
- 複数のFingerprintをマッチングするロジックを明示する
- より強力な暗号スイートを使うように更新など
- いつもの
- なぜTLSを使う必要があるのかについて
- SDPの用途
- SAP: セッションの告知
- オファー・アンサー: 示し合わせて交換
- どんな脅威が考えられるか
- セッションの傍受
- なりすまし
- アンサーを代わりに返しちゃうかも
- これらはTLSで防ぐことができる
- SDPを作成するエンドポイントのIPは不定
- だいたいが動的にIPやホスト名を決定する
- そうなると自己証明書しかない
- 自己証明書でSDPの記述の整合性を保証する
- 自己証明書のFingerprintをSDPの属性につける
- SDPにFingerprintを載せる例
a=fingerprint
属性をm=
セクションごとに
m=
行のプロトコルにTCP/TLS
を使う- そのほか
a=setup
とa=connection
も- WebRTCでは
a=setup
だけ
- WebRTCでは
- 認証にはX.509証明書を使う
- 自身が提示したFingerprintでTLSのハンドシェイクされることを期待する
a=fingerprint
行でそれを示す- ハッシュ関数の名前とそのハッシュ値を記述する
a=fingerprint:sha-256 92:BB:7F:59:47:FD:21:4D:D2:...
- MD2とMD5をハッシュ関数に使ってはいけない
- この属性は、セッションレベルでもいいし、メディアレベルでもいい
- セッションレベルにある場合は、すべてのメディアレベルで共通になる
- 複数の
a=fingerprint
属性を、単一のm=
セクションに紐付けられる - その場合は、SHA-256と任意のアルゴリズムにする
- WebRTCではそうならない
- 本文なし
- 証明書の用意について
c=
行にあるIPに一致する証明書にしてもよい- ただしワイルドカードパターンはだめ
- セキュリティの懸念はSection7.にて
- TLSのハンドシェイクでFingerprintが不一致の場合
bad_certificate
エラーで終了する
- オファー・アンサーでは、
a=setup:active
の側が証明書を提示する- クライアントが提示しない場合も、
bad_certificate
エラーで終了する
- クライアントが提示しない場合も、
a=setup:passive
またはa=setup:actpass
の場合は、オファー送信後すぐに接続を開始する- ただしFingerprintを照合できるまではそのデータを信頼してはいけない
- SDP自体をセキュアに転送する必要がある
- 保護されていないチャネルでSDPを受け取る場合は、ユーザーに警告が必要かも
- TLSより安全な選択肢もあるかもしれない
- SDPの
proto
としてTCP/TLS
を追加 - メディアレベルの属性に
fingerprint
を追加