MQTTの暗号化通信
前回、MQTTがPub/Sub(Publish/Subscribe)モデルのシステムで、メッセージ発行元とメッセージ購読者をブローカがトピックごとにつなぐことを解説しました。PublisherおよびSubscriberは異なるトピックであってもBrokerを共有することができるため、用途に応じてMQTTの仕組みを共有することができます(図1)。
今回はより実践的な取り組みとしてMQTTの暗号化通信についてみていきましょう。
![図1. MQTTのシステム基本理解](http://cz-cdn.shoeisha.jp/static/images/article/8020/8020_01_s.gif)
図2はMQTTの暗号化通信を図示したものです。Publisher, Broker, SubscriberがそれぞれTLS(Transport Layer Security)により通信経路が保護されます(※MQTT標準仕様ではUsename/Password認証も備わっていますが、今回の検証では割愛します)。
![図2. MQTTの暗号通信](http://cz-cdn.shoeisha.jp/static/images/article/8020/8020_02_s.gif)
それではPublisherおよびSubscriberがMQTT Brokerと暗号化通信によって接続するためのプログラムについて見ていきましょう。今回もMQTTのオープンな検証環境としてtest.mosquitto.orgを利用します。TLSによる暗号化通信を行うため、あらかじめtest.mosquitto.orgのWebサイトから証明書をC:\testにダウンロードしておきましょう(図3)。
![図3. test.mosquitto.orgから証明書をダウンロードする](http://cz-cdn.shoeisha.jp/static/images/article/8020/8020_03_s.gif)
続いて、MQTT Pythonライブラリを使ったClient/Publisher接続のプログラム例(暗号化通信)を見てみましょう(図4)。プログラムの中では、client.tls_set("mosquitto.org.crt") で証明書を使ったMQTT暗号化通信を指定した上で、client.connect("test.mosquitto.org", 8883)によってMQTT Brokerへ接続します。このオープン検証環境では、8883番と8884番ポートがSSL/TLS暗号化をサポートしています。
C:\test> notepad pub-mqtt-tls.py ※Windowsのメモ帳を使ってプログラム作成 # coding=utf8 import paho.mqtt.client as mqtt import time def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.tls_set("mosquitto.org.crt") client.connect("test.mosquitto.org", 8883) while client.loop() == 0: msg = "test message from Publisher "+time.ctime() client.publish("test", msg, 0, True) print("message published") time.sleep(1.5) pass
つづいて、MQTT Pythonライブラリを使ったClient/Subscriber接続のプログラム例(暗号化)を見てみましょう(図5)。
C:\test> notepad sub-mqtt-tls.py ※Windowsのメモ帳を使ってプログラム作成 # coding=utf8 import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("test") def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.tls_set("mosquitto.org.crt") client.connect("test.mosquitto.org", 8883) client.loop_forever()
MQTT Pythonライブラリを使ったClient/Publisher接続のプログラム例(暗号化通信)と同じく、client.tls_set("mosquitto.org.crt") で証明書を使ったMQTT暗号化通信を指定した上で、client.connect("test.mosquitto.org", 8883)によってMQTT Brokerへ接続します(図6)。
C:\test> py pub-mqtt-tls.py Connected with result code 0 message published :
なお、Wiresharkのパケットキャプチャが開始されてからプログラムを起動するように注意してください。