ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

MQTTのTLS、サーバーとクライアントの設定について

2020-08-18 08:06:46 | Weblog
MQTTの実装にMosquittoを使うにしろ、
(クライアントに)paho MQTTを利用するにしろ、
TLSを実装しないのならば、例が多くうまくいくけど、
TLSを実装する場合、例がはっきりしないため、うまくいかなくなる。

そこで、MQTTサーバー、MQTTクライアント、Paho MQTTでクライアント
の場合のTLS対応をまとめておく




■TLS対応するための準備ー必要な証明書について

 証明書はサーバーに対しては、結局、CA局とサーバー用の証明書がいる。
 証明書は3種類のファイルで構成されるので、合計6種類のファイルができるが、このうち、3種類しか、サーバーの設定には使わない。クライアントはCA局のあるファイル(1ファイル)のみあればよい。

・6種類のファイルの作成方法は以下の通り。
openssl genrsa -des3 -out mqtt_ca.key 2048
openssl req -new -x509 -days 3650 -key mqtt_ca.key -out mqtt_ca.crt
openssl genrsa -out mqtt_srv.key 2048
openssl req -new -out mqtt_srv.csr -key mqtt_srv.key
openssl x509 -req -in mqtt_srv.csr -CA mqtt_ca.crt -CAkey mqtt_ca.key -CAcreateserial -out mqtt_srv.crt -days 3650


【参考にしたサイト】
MosquittoブローカのTLS(SSL)認証設定
https://ficus-forum.myvnc.com/t/mosquitto-tls-ssl/154

これをubuntuのLinuxで実行。できたファイルは以下の6つ
mqtt_ca.crt
mqtt_ca.key
mqtt_ca.srl
mqtt_srv.crt
mqtt_srv.key
mqtt_srv.csr
(Windowsだと、opensslどうするとか、いろいろ考えないと面倒なのでLinuxで作った)





■MQTTサーバーでの設定
MQTTサーバーとしては、Pahoには多分ないと思うので、MosquittoのMQTTサーバーを使うこととします。
Linuxの例は多く、ググれば出てくると思うので、今回はWindowsで。
WindowsにMosquittoを入れる場合、トリッキーなことがあるんだけど、ここではそれを書いていると、話長くなるし、横道にそれすぎなので今回は省略。 windowsがインストールされているところから。
 今、Mosquittoは「C:\Program Files\mosquitto」にあるという前提で、以下話を進めます。

やることはWindowsでもLinuxでも同じ
・(上記で作成した6つのファイルのうちのある)3つのファイルをコピー
・mosquitto.conf修正

【3つのファイルをコピー】
 上記で作成したmqtt_ca.crt、mqtt_srv.crt、mqtt_srv.keyの3ファイルを
コピーないしは作成する。

 Linuxの場合、個々に入れるのが普通というところがあるのでネットで検索
 Windowsの場合、別にどこでもいいけど、今回はMosquittoを置いた「C:\Program Files\mosquitto」の下にした

 ファイルはコピーしてもいいけど、LinuxからWindowsに持ってくる場合、単純にLinux側にある各ファイルを開いてコピーし、Windows側に新規作成してコピーした内容をペーストして作成しても良い。6つのファイルすべてテキストファイルで長さもそんなではないので、そのようなことができる。


【mosquitto.conf修正】
Windowsというか、今回の例の場合、以下の通り
port 8883

cafile \Program Files\mosquitto\mqtt_ca.crt
certfile \Program Files\mosquitto\mqtt_srv.crt
keyfile \Program Files\mosquitto\mqtt_srv.key





■MQTTクライアントの設定
 クライアントにはpublisherとsubscribeの2種類ある。mosquittoの場合、pub/subともプログラムがあるので、それを起動する。paho_MQTTの場合はコーディングする。

【mosquittoの場合】
 pub/subいずれの場合もポートを8883にして、CA証明書だけ渡す。ほかの引数はTLSかけないときと同じ

・publishの場合のコマンド
cd \Program Files\mosquitto
mosquitto_pub -d -h localhost -t "topic/test" -m "hello world" --cafile "mqtt_ca.crt" -p 8883


・subscribeの場合のコマンド
cd \Program Files\mosquitto
mosquitto_sub -h localhost -t "topic/test" --cafile "mqtt_ca.crt" -p 8883


※参考にしたサイト
Mosquittoを用いてMQTT+SSL/TLS通信を試してみる
https://qiita.com/udai1532/items/c0f58e73f76900a8469f




【paho_mqttの場合】
publish,subscrbeのクライアントプログラムを作る。
その例は以下にあるけど

Paho(MQTT Client Library) -Python-
https://qiita.com/n-yamanaka/items/91dbd7bd9fed5b3fbed4

この例のサンプルコード(pub.pyとsub.py)、
cacert に上記mqtt_ca.crtのフルパスを設定。
mqtt_ca.crt、mqtt_ca.crtは設定しない(= None とする)でも、
TLSで接続できる。ちなみに、TLSの処理は
    client.tls_set(cacert,
        certfile = clientCert,
        keyfile = clientKey,
        tls_version = ssl.PROTOCOL_TLSv1_2)


で行っている。


※なお、エラーコードは以下を参照
Publish時のreturn値
https://creepfablic.site/2019/10/22/paho-mqtt-publish-return/

将来的には
MQTTバージョン5の概要 2018年版
https://qiita.com/toast-uz/items/b9f933b72467981562a3

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする