ファイナンス、情報通信技術のスキル・アグリゲーション・サイト
Node.js で MQTT クライアントを作成します。ライブラリは MQTT.js を利用します。また、ブローカーは、Mosquitto を使用しました。
Mosquitto については、Mosquitto(MQTT Broker)を Windows と Ubuntu にインストール も参照してみてください。
GitHub - mqttjs/MQTT.js: The MQTT client for Node.js and the browser の MQTT.js/examples/tls client のコードをベースに SSL/TLS の対応などを進めます。
MQTT クライアントについては、Paho(MQTT Client Library)サンプルプログラム(Python、JavaScript) でも取り扱っています。paho-mqtt.js は、npm でインストールして、Node.js でも利用できます。
The Paho JavaScript Client is an MQTT browser-based client library written in Javascript that uses WebSockets to connect to an MQTT Broker.
MQTT.js is a client library for the MQTTprotocol, written in JavaScript for node.js and the browser.
paho-mqtt.js は、ブラウザベースのクライアントライブラリ、mqtt.js は Node.js とブラウザ用のクライアントライブラリ、という紹介になっています。
次に、かんたんに Node.js とパッケージ管理の npm のインストールをみていきます。
たとえば、Ubuntu 16.04 LTS 標準のままの apt もしくは apt-get でインストールすると、古いバージョンがインストールされます。
$ sudo apt install nodejs
このことをふまえながら Google 検索してみていくと、Ubuntu では、多くの方が n というバージョン管理パッケージを利用しているようです。
npm も含めてインストールは簡単に、という思いもあり、以下のページの手順でインストールを進めました。
https://nodejs.org/
LTS( long-term support )版の場合。
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ sudo apt install -y nodejs
最新版の場合。
$ curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
$ sudo apt install -y nodejs
この手順では、Node.js とともに npm もインストールされます。また、nodejs コマンドのほか、node コマンドでも使えるようになっています。
次に、npm を利用して、mqtt.js をインストールします。
$ npm install mqtt
続いて、mosquitto.conf の設定例です。
# Default listener
listener 1883
# Certificate based SSL/TLS support
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
tls_version tlsv1.2
require_certificate true
password_file /etc/mosquitto/passwd
上記の SSL/TLS 証明書の設定では、サーバ証明書を記載しています。今回作成する MQTT クライアントは、クライアント証明書も使用することとしました。 tls_version tlsv1.2 は、TLS バージョンを明示して設定しています。 require_certificate true は、接続するすべてのクライアントがクライアント証明書を必要とします。なお、クライアント証明書のないクライアントも接続する場合、false に設定します。
さらに、パスワードファイルも使用します。バスワードファイルは、 mosquitto_passwd の手順で管理します。作成コマンド例です。
$ mosquitto_passwd -c /etc/mosquitto/passwd ral
さて、今回使用したサーバ証明書やクライアント証明書は、プライベート認証局(CA)を作成して、プライベート SSL/TLS 証明書を発行したものです。この手順については、プライベート認証局でプライベート SSL/TLS 証明書を発行する も参考にしてください。
今回作成した MQTT クライアントのコード例です。
var mqtt = require('mqtt')
var fs = require('fs')
var _ca_certs = '/etc/mosquitto/certs/ca.crt'
var _certfile = '/etc/mosquitto/certs/client.crt'
var _keyfile = '/etc/mosquitto/certs/client.key'
var KEY = fs.readFileSync(_keyfile)
var CERT = fs.readFileSync(_certfile)
var TRUSTED_CA_LIST = fs.readFileSync(_ca_certs)
var PORT = 8883
var HOST = 'host.jp'
var _topic ='test'
var _username = 'ral'
var _password = 'ralpasswd'
var options = {
port: PORT,
host: HOST,
key: KEY,
cert: CERT,
rejectUnauthorized: false,
// The CA list will be used to determine if server is authorized
ca: TRUSTED_CA_LIST,
protocol: 'mqtts',
secureProtocol: 'TLSv1_2_method',
username: _username,
password: _password
}
var client = mqtt.connect(options)
client.subscribe(_topic)
client.publish(_topic, 'Current time is: ' + new Date())
client.on('message', function (topic, message) {
console.log('subscribe->'+message)
})
client.on('connect', function () {
console.log('Connected')
})
client.on('error', function (err) {
console.log(err)
client.end()
})
rejectUnauthorized: false は、プライベート認証局の CA 証明書を使用していることによります。secureProtocol: 'TLSv1_2_method' は、ブローカーの TLS バージョンの設定にあわせたものです。
テストに使用した Mosuitto クライアントコマンドの Subscribe コマンド例です。
mosquitto_sub --cafile /etc/mosquitto/certs/ca.crt --cert /etc/mosquitto/certs/client.crt --key /etc/mosquitto/certs/client.key -t test -p 8883 -h host.jp -u ral -P ralpasswd --tls-version tlsv1.2
テストに使用した Mosuitto クライアントコマンドの Publish コマンド例です。
mosquitto_pub --cafile /etc/mosquitto/certs/ca.crt --cert /etc/mosquitto/certs/client.crt --key /etc/mosquitto/certs/client.key -t test -p 8883 -m Message -h host.jp -u ral -P ralpasswd --tls-version tlsv1.2