見出し画像

【AtmosBot2.1Pi】 Ambientとの通信を暗号化する

はじめに

以前、一時的にAtmosBotの調子が悪かった時、原因究明のためRaspberry Pi上でtcpdumpを使ってパケットキャプチャーを取得していた。

その際、Ambientとの通信がHTTPで送信されていて暗号化されていないことに気づいた。

送信するデータにはチャネル番号やライトキーを含んでいる。第三者が使っているチャネルに送ることもできてしまう。

そこでHTTPSで暗号化してデータ送信するように変更してみた。

HTTPS化

Ambientとの通信にはGitHubで公開されている下記のPythonのライブラリーを使っている。

Ambientのサンプルコードをそのまま真似て使っていたのだが、このままでは暗号化されずにHTTPで送信されてしまう。

GitHubのコードを参照すると、コンストラクターでssl = Falseとデフォルト引数があり、明示的にssl = TrueとしなければHTTPSで送信できないことがわかった。

am = ambient.Ambient(channel, writekey, ssl = True)
r = am.send(data)

tcpdumpで443番ポートでデータが暗号化して送信されていることを確認。

19:45:02.087769 IP (tos 0x0, ttl 64, id 16202, offset 0, flags [DF], proto TCP (6), length 391)
192.168.10.17.51552 > ambidata.io.https: Flags [P.], cksum 0xd0af (incorrect -> 0xedc7), seq 1:340, ack 1, win 502, options [nop,nop,TS val 3756956217 ecr 3167460840], length 339
E...?J@.@.*...
.6A.;.`..3.i.4$."...........
...9........N...J....\.....pd....dR.6.U...Y...B...9 .\...k^.....1.......e..dEO..Y.h..b.......,.0.+./...................$.(.
.......k.j.9.8.....#.'. .......g.@.3.2.............=.<.5./...............ambidata.io.........
...
...........#.............*.(........... .
...........................+........-.....3.&.$...
~..WeC..1\e.a...........l..e..(
19:45:02.129965 IP (tos 0x30, ttl 61, id 25601, offset 0, flags [DF], proto TCP (6), length 52)
    ambidata.io.https > 192.168.10.17.51552: Flags [.], cksum 0x390c (correct), seq 1, ack 340, win 486, options [nop,nop,TS val 3167460948 ecr 3756956217], length 0
E0.4d.@.=.
]6A.;..
....`4$."3.j.....9......
...T...9

ThingSpeakはライブラリーは使わず、下記のようなコードでPOSTしていたのでHTTPSになっていた。

headers = {'X-THINGSPEAKAPIKEY': writekey}
response = requests.post('https://api.thingspeak.com/update/', headers = headers, data = data)

今回はここまで。


いいなと思ったら応援しよう!

天文と気象(とその他いろいろ)
よろしければ、サポートをお願いします。 より多くの方に役立つnoteを書けるよう頑張ります!!