MicroPythonでTLS/SSL通信を行ってWiresharkでデコードする

前回記事ではPython3でTLS/SSL行ったが、
MicroPythonでもusslとしてTLS/SSLが実装されており、セキュア通信を行うことが出来る。
今回は、MicroPythonとUbuntu間でセキュア通信を行い、その通信をtcpdumpでパケットキャプチャしたうえでWiresharkでデコードしてみた。

tcpdumpでWiFi通信のパケットキャプチャを行うためには、Ubuntu上に構築したWiFIアクセスポイント(参考記事1, 参考記事2)にパケットキャプチャ対象のホストを接続させておけば簡単に出来る。

スポンサーリンク

サーバの準備

サーバは前回記事で作成したPython3版のサーバをそのまま使うが、サーバのIPアドレスは127.0.0.1(localhost)ではなくてUbuntu上に構築したWiFiアクセスポイントのアドレスである192.168.11.1に変更する。

sslclient.py(Python3)

import socket, ssl

HOST, PORT = "192.168.11.1", 12345

data = "Hello Python TLS/SSL Server!"

# SSLコンテクストの準備
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
: (以下略)

MicroPython版クライアント

クライアントのプログラムは以下の通り。SSLソケットへのラップが追加されただけで、
TCPクライアントと殆ど同じだ。

usslclient.py(MicroPython)

import usocket,ussl

HOST, PORT = "192.168.11.1", 12345

data = "Hello Python TLS/SSL Server!"

# ソケットの作成とサーバへの接続
sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM);
saddr = usocket.getaddrinfo(HOST,PORT)[0][-1]
sock.connect(saddr)

# SSLソケットへのラップ
ssock = ussl.wrap_socket(sock)

# データを送る
ssock.write(bytes(data + "\n", "utf-8"))

# サーバからのデータを受信して終了
received = str(ssock.read(1024), "utf-8")
ssock.close()

print("Sent:     " + data)
print("Received: " + received)

Python3ではTCPソケットをSSLソケットでラップしてから接続を行うが、
MicroPythonでは先にTCPソケットを接続してからSSLソケットへのラップを行う。

また、Python3ではSSLコンテクストに色々オプションを指定することが出来たが、
MicroPythonのusslは簡易実装のためかSSLコンテクストという仕組み自体が存在せず、
いきなりwrap_socketでTCPソケットをSSLソケットでラップする。

Wiresharkで通信をデコードする

tcpdumpで上記クライアントの実行時のパケットキャプチャを行う。

$ sudo tcpdump -i wlp2s0 -s 0 -w upyssl.pcap

WiresharkのTLSプロトコル設定で”RSA key list”に前回記事で作成したkey.pemを設定したうえで、キャプチャ結果を表示。

MicroPythonではごく限られた暗号スイートしか実装されていない。Wiresharkでキャプチャ結果の中からFrame 4のClient Helloパケットをの中を覗いてみると、Cipher Suite(暗号スイート)としてTSL_RSA_WITH_AESのバリエーション4つしか選択肢が無いことがわかる。

つまりMicroPythonにはDH鍵共有が実装されておらず、(Python3の時とは対照的に)特に何も設定しなくてもTLS/SSL通信のデコードが可能だ。
Frame 14のサーバからの応答パケットがデコードされ中身を見ることが出来た。

MicroPythonによるTLS/SSL通信の安全性には注意

DH鍵共有による暗号化は秘密鍵が流出したとしても暗号文の解読が出来ないため、固定鍵を直接使う場合と比較して安全とされている(だからこそTLS1.3では固定鍵による暗号化がプロトコルから削除されたのだろう)。

MicroPythonのTLS/SSLは「とにかく最低限接続出来れば良い」という思想のもと作られている感じで、DH鍵共有が出来ないだけでなく証明書のチェックも一切していない。したがって、安全性は「それなり」と考えるべきだろう。

とはいえ、ESP8266のような小さなマイコンでTLS/SSL通信を簡単に実現出来る恩恵は計り知れない。今後、色々活用させて頂こうと思う。

コメント