WebRTC実装のDTLSにRFC 5746 Renegotiation Indication Extensionを実装する
経緯
typescript製のNode.js用WebRTCのプロトコルスタックを実装している
現在、他のWebRTCスタック実装者さんたちと相互接続試験をすすめており、Bouncy Castle DTLSというライブラリを使用しているWebRTC実装とDTLSが疎通しない問題が発覚した。
原因はBouncy Castle DTLS がRenegotiation Indication Extensionを必須としてるから
sipsorceryというWebRTCスタック実装の作者さんがPionでRenegotiation Indication Extensionを実装したPRのリンクを紹介してくれてたのでそれを参考に実装してみる
Renegotiation Indication ExtensionのRFCはこれ
まず https://github.com/tex2e/rfc-translater というツールでRFCを翻訳して読む
ざっくり読んだから
を参考にしながら実装していくlibwebrtcとだけ疎通すればいいのならOpenSSLと疎通するようにDTLSの実装をすればいいけど、その他の実装と疎通させたい場合はDTLSで互換性の問題が出ることを今回の出来事から学んだ。
というよりはOpenSSLがいろんな実装と疎通できるように頑張ってくれてるだけなんだろうけど....
そもそもWebRTCでDTLSの再ネゴシエーションすることなんてあるんだろうか?
PionのPRもExtensionしか実装していないから、Bouncy Castle DTLSのバリデーション?をバイパスできればそれで良い説
とりあえず実装したものの、Bouncy Castle DTLSからFinished後にEncrypted Alertを返されて謎
sipsorceryのDTLSと疎通した。結局、Renegotiation Indication Extensionと関係ないところで詰まってた。
Renegotiation Indication Extension自体はPionのアプローチと同じように単にExtensionを追加するだけでBouncy Castle DTLSの要求を満たせた