私はssl/tlsを使用して暗号化されたmosquittoブローカーをセットアップしようとしています。クライアント証明書を生成したくありません。暗号化された接続が欲しいだけです。
Manページには、利用可能な設定のみが記載されており、必要な設定や使用方法は記載されていません。
どの設定が必要で、どのように設定しますか?
私はmosquitto 1.3.5を使用しています
ここに小さなガイドがありますが、それはあまり言いません: http://mosquitto.org/man/mosquitto-tls-7.html
これらを設定する必要があります:certfile keyfile cafile
それらは上のリンクのコマンドで生成できます。しかし、このスクリプトを使用する方が簡単です: https://github.com/owntracks/tools/blob/master/TLS/generate-CA.sh
スクリプトを実行して設定を変更すると、次のようになります。
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/hostname.localdomain.crt
keyfile /etc/mosquitto/certs/hostname.localdomain.key
MosquittoがUnable to load server key file
と言う場合は、mosquittoを実行しているユーザーがファイルを読み取る権限を持っていないことを意味します。 rootとして起動した場合でも、ブローカーは別のユーザー、たとえばmosquittoとして起動する可能性があります。これを解決するには、たとえばchown mosquitto:root keyfile
ブローカーに接続するには、クライアントにca.crt-fileが必要です。これを指定しない場合、ブローカーは次のようなメッセージを表示します。
OpenSSLエラー:エラー:1408F10B:SSLルーチン:SSL3_GET_RECORD:間違ったバージョン番号
これをmosquitto_subコマンドに提供するには、--cafile pathToCaCrt
を使用します。 ca.crtはクライアントと共に配布でき、接続されているサーバーが実際に正しいサーバーであることを確認します。
Mosquitto_subの--insecure
フラグは、クライアントに(wgetなどのように)すべての証明書を受け入れさせるのではなく、証明書が共通名で接続しているホストを持たないようにするだけです。したがって、証明書にブローカーホストが共通名として含まれていることを確認する必要があります。
MosquittoのWebSocketアクセスを保護するため。 Let's Encrypt証明書を使用すると、設定ファイルは次のようになります。
listener 9001
protocol websockets
certfile /etc/letsencrypt/live/yourdomain.com/cert.pem
cafile /etc/letsencrypt/live/yourdomain.com/chain.pem
keyfile /etc/letsencrypt/live/yourdomain.com/privkey.pem
ファイルがMosquittoによって読み取り可能であることを確認します(特に、Debianは特権のないmosquitto
ユーザーの下でMosquittoを実行します)。 WebSocketをサポートするにはMosquitto 1.4が必要です。
Paho JavaScriptクライアントを使用してこのWebSocketに接続するには:
// Host and port overwritten at connect
var mqtt = new Paho.MQTT.Client("yourdomain.com", 9001, "");
mqtt.connect({
hosts: [ "wss://yourdomain.com:9001/" ],
useSSL: true
});
これはまだアクセス制御を意味しないので、MQTTブローカーはパブリックにアクセスできることに注意してください。承認を追加することもできます。