Mosquitto へ SSL で接続してみる
「Mosquitto の SSL 対応を試してみる」で SSL 対応しました。そこで作成したクライアント用のキーと証明書を使用して、今回は、クライアントからの接続を試みます。
これまでにいくつか Python で MQTT クライアントプログラムを作成していますが、これらを改造して利用します。
最初に「Mosquitto の payload を MongoDB に保存してみる」のプログラムです。
import os, sys import time from datetime import datetime import paho.mqtt.client as paho sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../model') from mchat import (connecter, ChatLog) def on_connect(mosq, obj, rc): print("on connect [rc]:" + str(rc)) def on_message(mosq, obj, msg): now = int(time.mktime(datetime.now().timetuple())) ChatLog(text=msg.payload, user='MQTT', created_at=now).save() print("on message [topic]:"+msg.topic + " [qos]:" + str(msg.qos) + " [payload]:" + str(msg.payload)) def on_publish(mosq, obj, mid): print("on publish [mid]:" + str(mid)) def on_subscribe(mosq, obj, mid, granted_qos): print("on subscribe [mid]:" + str(mid) + " [qos]:" + str(granted_qos)) def on_disconnect(mosq, obj, rc): print("on disconnect [rc]:" + str(rc)) def on_log(mosq, obj, level, string): print(string) mqttc = paho.Client() mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.on_publish = on_publish mqttc.on_subscribe = on_subscribe mqttc.on_disconnect = on_disconnect mqttc.username_pw_set("mqtt", "mqttpasswd") ca_certs = "/etc/mosquitto/ca/ca.crt" certfile = "/etc/mosquitto/tls/client.crt" keyfile = "/etc/mosquitto/tls/client.key" mqttc.tls_set(ca_certs, certfile, keyfile, cert_reqs=paho.ssl.CERT_REQUIRED, tls_version=paho.ssl.PROTOCOL_TLSv1, ciphers=None) mqttc.connect("www.hoge.jp", 8883, 60) connecter() mqttc.subscribe("test/chat", 0) mqttc.publish("test/chat", "conected mqtt subscribe") mqttc.loop_forever()
続いて「Mosquitto Publish と Server-Sent Events で Python チャットサンプルを改造」の mqttc.py です。
import paho.mqtt.client as paho def MQTTpub(msg): mqttc = paho.Client(client_id="gwclient", clean_session=True, protocol=paho.MQTTv311) mqttc.username_pw_set("mqtt", "mqttpasswd") ca_certs = "/etc/mosquitto/ca/ca.crt" certfile = "/etc/mosquitto/tls/client.crt" keyfile = "/etc/mosquitto/tls/client.key" mqttc.tls_set(ca_certs, certfile, keyfile, cert_reqs=paho.ssl.CERT_REQUIRED, tls_version=paho.ssl.PROTOCOL_TLSv1, ciphers=None) mqttc.connect("www.hoge.jp", 8883, 60) mqttc.publish("test/chat", msg, 0) mqttc.disconnect()
なお、使用している paho-mqtt パッケージは、SSL/TLS のサポートが Python 2.7 からとなっているようです。
わたしの環境は、CentOS 6.5、Python 2.6.6 ですので、Python 2.7 を追加しなければ確認できませんでした。
とりあえず確認するために、この記事時点で最新バージョンの Python 2.7.8 を追加しました。
インストール先です。
mkdir /opt/local cd /opt/local
Development tools をインストールします。
yum groupinstall "Development tools" yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-deve
Python 2.7.8 をダウンロードします。
curl -O https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz tar zxf Python-2.7.8.tgz
Python 2.7.8 をインストールします。
cd Python-2.7.8 ./configure --prefix=/opt/local make && make altinstall
easy_install をインストールします。
curl -O http://python-distribute.org/distribute_setup.py /opt/local/bin/python2.7 ./distribute_setup.py
virtualenv をインストールします。
/opt/local/bin/easy_install-2.7 virtualenv
easy_install-2.7 を使用して必要なパッケージをすべてインストールします。
easy_install-2.7 gevent bottle pytz mongoengine paho-mqtt supervisor
そして、python2.7 で実行します。