Open2

非SSLなローカルデバイスとWebRTCでセキュアに通信したい問題

okuokuokuoku

WebRTCは他のWeb上の通信プロトコルと違って、CAに承認された証明書を要求しない。このため、SSHとかPGPのような非中央集権的な暗号通信を実現できる可能性がある。

レギュレーション

やりたいことは:

  • デバイスは(picoでない)Raspberry Piのようなそれなりのリソースを持ったデバイスである
  • ブラウザはFirefox、iOS safari、各種Blinkベースブラウザを想定する
  • デバイスは libdatachannel で実装されたWebRTC datachannelと、UI用のhttpサーバーを持つ
  • ブラウザはGitHub Pagesのような静的なHTTPSサイトと、デバイスが提供する HTTP (HTTPSでない)サイトを表示できる
  • 外部のリソースは静的なHTTPSサイトとSTUNサーバを除いて使用しない: Workersのような動的なスクリプトホストも使用しない
  • デバイスとブラウザは同一ネットワークに属する: TURNによる中継は今回は考えなくて良い

要はデバイスのファームウェアアップデートとか制御をよりリッチなAPIで行いたいなと。(HTTPSなサイトでないとWeb Pushとか使えないので)

UI

接続した後にどうやって画面出すのか考えてなかった。。例えばLuminoとかxterm.jsを決め打ちで搭載しておいて、デバイスからはWebAssemblyなアプリを送り込んで実行する。。とか。。?

https://github.com/jupyterlab/lumino

Service workerを使えば通常のwebappも直接ホストできるけど、流石にinsecure過ぎる気がする。

okuokuokuoku

手動ICE

WebRTCはシグナリングについては自前で実装できるので、当然手動でも接続処理を行える。例えば↓のサンプルは必要なデータを"人間がコピペで転送する"ことでブラウザ間の接続を実現している。

https://ja.tech.jar.jp/webrtc/datachannel.html

https://jar.jp/samples/webrtc-datachannel.html

で、コピペの代わりにWeb UIに表示させたリンクをポチポチとクリックさせるか、自動リフレッシュで飛ばすかしてコピペよりももう少し楽に接続処理を行わせることを考えたい。

例えば Clipboard APIはhttpsでないと使えないし、mixed content制約により、HTTPSサイトからHTTPサイトに fetch することもできない等、UIを素のHTTPで提供することによる制約を何とかワークアラウンドした仕組みを考える必要がある。