SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

システム環境の明後日を支える新技術

IoT時代を支えるプロトコル「MQTT」(後編)

システム環境の明後日を支える新技術(6)

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本連載では、さくらインターネット研究所が独自に調査研究を行った3~5年先に必要とされる新技術とその在り方についてご紹介いたします。「明日にでも、すぐ実用!」という技術ではなく、少し先の未来の技術について情報共有致しますので、タイトルを「明後日の~」としています。今回も前回の『IoT時代を支えるプロトコルMQTT(中編)』に続き、MQTT(MQ Telemetry Transport)の仕組みについて、詳しく見ていきましょう。

  • X ポスト
  • このエントリーをはてなブックマークに追加

MQTTの暗号化通信

 前回、MQTTがPub/Sub(Publish/Subscribe)モデルのシステムで、メッセージ発行元とメッセージ購読者をブローカがトピックごとにつなぐことを解説しました。PublisherおよびSubscriberは異なるトピックであってもBrokerを共有することができるため、用途に応じてMQTTの仕組みを共有することができます(図1)。

 今回はより実践的な取り組みとしてMQTTの暗号化通信についてみていきましょう。

図1. MQTTのシステム基本理解
図1. MQTTのシステム基本理解

 図2はMQTTの暗号化通信を図示したものです。Publisher, Broker, SubscriberがそれぞれTLS(Transport Layer Security)により通信経路が保護されます(※MQTT標準仕様ではUsename/Password認証も備わっていますが、今回の検証では割愛します)。

図2. MQTTの暗号通信
図2. MQTTの暗号通信

 それではPublisherおよびSubscriberがMQTT Brokerと暗号化通信によって接続するためのプログラムについて見ていきましょう。今回もMQTTのオープンな検証環境としてtest.mosquitto.orgを利用します。TLSによる暗号化通信を行うため、あらかじめtest.mosquitto.orgのWebサイトから証明書をC:\testにダウンロードしておきましょう(図3)。

図3. test.mosquitto.orgから証明書をダウンロードする
図3. test.mosquitto.orgから証明書をダウンロードする

 続いて、MQTT Pythonライブラリを使ったClient/Publisher接続のプログラム例(暗号化通信)を見てみましょう(図4)。プログラムの中では、client.tls_set("mosquitto.org.crt") で証明書を使ったMQTT暗号化通信を指定した上で、client.connect("test.mosquitto.org", 8883)によってMQTT Brokerへ接続します。このオープン検証環境では、8883番と8884番ポートがSSL/TLS暗号化をサポートしています。

図4. MQTT Pythonライブラリを使ったClient/Publisher接続のプログラム例(暗号化通信)
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)。

図5.MQTT Pythonライブラリを使ったClient/Subscriber接続のプログラム例(暗号化)
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)。

図6. MQTT Pythonライブラリを使ったClient/Publisher接続の実行例(暗号化通信)
C:\test> py pub-mqtt-tls.py
Connected with result code 0
message published
:

 なお、Wiresharkのパケットキャプチャが開始されてからプログラムを起動するように注意してください。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
MQTT暗号化通信を解析する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
システム環境の明後日を支える新技術連載記事一覧

もっと読む

この記事の著者

松本 直人(マツモト ナオト)

1996年より特別第二種通信事業者のエンジニアとしてインターネット網整備に従事。その後システム・コンサルタント,ビジネス・コンサルタントを経て2010年より,さくらインターネット株式会社 / さくらインターネット 研究所 上級研究員。(2016年より一時退任)研究テーマはネットワーク仮想化など。3~5年先に必要とされる技術研究に取り組み、世の中に情報共有することを活動基本としている。著書: 『モノのインターネットのコトハジメ』,『角川インターネット講座 ~ビッグデータを開拓せよ~』など多数。情報処理学会 インターネットと運用技術研究会 幹事

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8020 2014/09/30 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング