English

SINETStreamからMQTTのSSL/TLS認証(クライアント認証)を利用する

概要

SSL/TLSの双方向認証をおこなうように設定をされた MQTT ブローカーをSINETStreamから利用する方法について説明する。

この文書のおもな記述の流れを以下に示す。

  1. 設定手順の前提条件について
  2. MQTTブローカー(Mosquitto)にSSL/TLSの双方向認証を設定する手順について
  3. SINETStreamからSSL/TLSの双方向認証を行うMQTTブローカーにアクセスする手順について
  4. 認証エラーとなった場合のSINETStreamの挙動について

前提条件

MQTTブローカーの構成やSSL/TLSの設定については様々な状況が想定される。 設定手順の記述を簡潔にするために、ここでは以下の前提条件をおく。

(*1) 動作確認用の証明書の作成手順については「プライベート認証局における証明書の作成手順」を参照のこと。

設定例を示す場合のホスト名などの値を以下に示す。

実際に設定を行う際は、以下の値に対応する箇所を環境に合わせて適宜変更すること。

ブローカー側の設定手順

MQTTブローカー(Mosquitto)にSSL/TLSの双方向認証を設定する手順について説明する。

以下の手順で設定を行う。

  1. MQTTブローカーの設定ファイルを更新する
  2. MQTTブローカーに設定ファイルの再読み込みを行わせる

設定ファイルにSSL/TLS認証の設定を追加する

以下の内容を追加する。

per_listener_settings true
listener 8883
cafile /etc/pki/CA/cacert.pem
certfile /etc/pki/CA/certs/broker.crt
keyfile /etc/pki/CA/private/broker.key
require_certificate true

各項目の簡単な設定内容について以下に示す。

設定ファイルの再読み込みを行わせる

設定ファイルの再読み込みを行わせるためにSIGHUPシグナルを送る。

$ sudo killall -HUP mosquitto

SINETStream(クライアント側)の設定手順

SINETStreamからSSL/TLS認証を行うMQTTブローカーを利用するための設定について説明する。 以下の作業が必要となる。

  1. 証明書の準備
  2. SINETStreamの設定ファイルの作成
  3. SINETStreamを利用するプログラムの作成

証明書の準備

SSL/TLSの双方向認証を利用するのに必要となる証明書類をクライアント環境に準備する。 以下のものが必要となる。

プライベート認証局などで作成した証明書をクライアント環境に配置する。 SINETStreamでは証明書の配置場所を定めてはいないので、配置する場所は利用者の判断にゆだねられる。 SINETStreamは、設定ファイルに記されたパスから証明書を読み込む。

SINETStreamの設定ファイルを作成する

設定ファイルの例を以下に示す。

service-mqtt-ssl:
  brokers: broker.example.org:9093
  type: mqtt
  topic: topic-001
  tls:
    ca_certs: /opt/certs/cacert.pem
    certfile: /home/user01/certs/client0.crt
    keyfile: /home/user01/certs/client0.key

brokers, type, topic については認証を利用しない場合の設定ファイルと同様なので説明を省く。 SSL/TLS認証に関わる設定は tls: 以降の行が該当する。各パラメータの意味を以下に示す。

SINETStreamを利用するプログラムを作成する

SINETStreamを利用するプログラム自体は、 SSL/TLS認証を行うMQTTブローカーを利用する場合と認証なしのMQTTブローカーを利用する場合で変わりはない。

Python APIの MessageWriter を利用する場合の例を以下に示す。認証に関わる処理は存在していない。

with sinetstream.MessageWriter(service='service-mqtt-ssl') as writer:
    writer.publish(b'message 001')

認証情報をプログラムから設定したい場合は、コンストラクタの引数に認証情報のパラメータを追加すればよい。

tls = {
    'ca_certs': '/opt/certs/cacert.pem',
    'certfile': '/home/user01/certs/client0.crt',
    'keyfile': '/home/user01/certs/client0.key',
}
with sinetstream.MessageWriter(service='service-mqtt', tls=tls) as writer:
    writer.publish(b'message 001')

認証エラーとなる場合の挙動について

Python API

認証でエラーになった場合、例外 sinetstream.error.ConnectionError が発生する。 例外が発生するメソッドを以下に示す。

Java API

認証でエラーになった場合、例外 jp.ad.sinet.stream.api.AuthenticationException が発生する。例外が発生するメソッドを以下に示す。