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