MQTT 证书验证失败

MQTT 证书验证失败

我一直在拼命尝试让我的 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

我不知所措。这对我来说毫无意义!任何帮助我都感激不尽!

答案1

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

这表明您连接的主机名与证书中的主机名不匹配。

尝试mosquitto_pub使用该--insecure选项。

或者,您没有正确的 CA 证书链,因此客户端无法验证服务器证书。

答案2

我能够使用 Java 完成此操作。还请尝试在 MacBook 上使用 MQTTBox 应用程序,看看是否能够连接。

检查此 MQTTBox 配置: 检查此 MQTTBox 配置

答案3

最有可能的是,弱加密算法是您的密钥/证书的一部分。例如,debian 已将要求提升至 openssl-1.1.1 的更新版本,请参阅https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1

要获取支持的算法列表,请ECLEVEL=2使用以下 openssl 命令:openssl ciphers -s -v 'ALL:@SECLEVEL=2'

在大多数情况下,您已选择长度小于等于 1024 位的 rsa 密钥或 sha1 作为签名算法。运行openssl x509 -in yourcert.crt -noout -text并检查Public-Key:Signature Algorithm:属性。

如果密钥太小,则需要重新创建完整的密钥+证书集。如果签名算法太弱,则只能重新创建证书:您可以使用现有密钥和证书中的信息创建新的 CSR:

openssl x509 -x509toreq -in sha1.crt -signkey sha1.key -out sha256-new.csr -sha256

或者在再次签署现有的 CSR 时覆盖算法:

openssl x509 -req -days 360 -in sha1.csr -CA DummyCA-DonotTrust.pem -CAkey DummyCA-DonotTrust.pem -CAcreateserial -out sha256.crt -sha256

-sha256是重点部分。最近的 openssl 版本应该默认使用 sha256。

相关内容