Linux

MQTT 證書驗證失敗

  • July 26, 2021

我一直在拼命地試圖讓我的 MQTT 客戶端連接到我的 MQTT 代理,該代理設置有來自 CA(Letsencrypt)的證書。

為了能夠獲得 CA 證書,我使用了letsencrypt python 命令(https://pypi.python.org/pypi/letsencrypt/0.4.1

./letsencrypt-auto certonly -d www.myserver.com

這給了我:

lrwxrwxrwx 1 root root   41 Mar  6 23:50 cert.pem
lrwxrwxrwx 1 root root   42 Mar  6 23:50 chain.pem
lrwxrwxrwx 1 root root   46 Mar  6 23:50 fullchain.pem
lrwxrwxrwx 1 root root   44 Mar  6 23:50 privkey.pem

這些文件我也用於我的網站 (apache2) 上的 SSL 加密,它似乎在我的 conf 文件中工作得很好:

SSLCertificateFile /etc/letsencrypt/live/www.server.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.server.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

在我的網路伺服器上執行時,我看到了 SSL 圖示,它可以正常工作。

現在,當我將這些文件放入我的 /etc/mosquitto/mosquitto.conf 時:

cafile /etc/letsencrypt/live/www.myserver.com/fullchain.pem
certfile /etc/letsencrypt/live/www.myserver.com/cert.pem
keyfile /etc/letsencrypt/live/www.myserver.com/privkey.pem

我能夠啟動代理,v1.4.8 很好:

[ ok ] mosquitto is running.

並從日誌中:

1457462631: mosquitto version 1.4.8 (build date Sun, 14 Feb 2016 15:06:55 +0000) starting

然而,當我嘗試訂閱測試主題時,使用客戶端的以下命令進行測試:

mosquitto_sub version 1.4.8 running on libmosquitto 1.4.8.

執行命令:

root@titan:~# mosquitto_pub -h www.myserver.com -p 8883 -t test --cafile /etc/letsencrypt/live/www.myserver.com/fullchain.pem

它在我的命令行中提到:

Unable to connect (A TLS error occurred.).

對 mosquitto.log 文件進行更好奇的觀察會告訴我:

1463562141: Socket error on client <unknown>, disconnecting.
1463562154: New connection from X.X.X.X on port 8889.

這給了我令人驚訝的小資訊。我從網站上使用的一個 python 腳本給了我更多的資訊;

Python腳本:

import os, subprocess, socket, sys, time, struct import *
import paho.mqtt.client as mqtt

dir = "/etc/letsencrypt/live/www.server.com/"

def on_connect(mqttc, obj, flags, rc):
   if rc != 0:
       exit(rc)
   else:
       mqttc.disconnect()

def on_disconnect(mqttc, obj, rc):
   obj = rc

run = -1
mqttc = mqtt.Client("08-ssl-connect-crt-auth", run)
mqttc.tls_set(dir + "fullchain.pem", dir + "cert.pem", dir + "privkey.pem")
mqttc.on_connect = on_connect
mqttc.on_disconnect = on_disconnect

mqttc.connect("www.server.com", 8889)
while run == -1:
   mqttc.loop()

exit(run)

這讓我回想起:

ssl.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我在這裡不知所措。這對我來說毫無意義!任何幫助表示讚賞!

ssl.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

這表明您連接的主機名與證書中的主機名不匹配。

mosquitto_pub嘗試使用該選項--insecure

或者,您沒有正確的 CA 證書鏈,因此客戶端無法驗證伺服器證書。

我能夠使用 Java 完成這項工作。還可以嘗試在 MacBook 上使用 MQTTBox 應用程序來查看您是否能夠連接。

檢查此 MQTTBox 配置: 檢查此 MQTTBox 配置

引用自:https://serverfault.com/questions/777477