我正在尝试为 mqtt 实现 TLS,并已按照以下链接中的教程进行操作 http://www.steves-internet-guide.com/mosquitto-tls/
我完全按照指示使用 openssl 生成证书并将其粘贴到 mqtt 的位置,并更改了 mqtt 的conf并重新启动了服务。 但是当我尝试使用 tls 连接到 mqtt 时,它显示以下错误消息
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1124)
Python代码是
client1 = paho.Client("control1")
client1.tls_set(ca_certs="ca.crt")
client1.tls_insecure_set(True)
client1.connect("localhost", 8883)
client1.loop_forever()
其中 ca.crt 位于项目目录中。
您收到的消息表明经纪人的服务器证书不受信任(因为它是自签名的),因此泛美卫生组织没有被正确告知它是值得信赖的。
您的假证书颁发机构的根证书(您提供给 paho 的
ca.crt
文件)可能未正确签名或生成,或者 Mosquitto 使用的证书未正确签名。无论哪种方式,您可能需要重新开始整个过程才能 100% 确定一切都正确完成。
生成伪造的证书颁发机构 (CA) 签名密钥
$ openssl genrsa -des3 -out ca.key 2048
为假 CA 生成证书签名请求
$ openssl req -new -key ca.key -out ca-cert-request.csr -sha256
创建假CA的根证书
$ openssl x509 -req -in ca-cert-request.csr -signkey ca.key -out ca-root-cert.crt -days 365 -sha256
创建服务器/mqtt代理的密钥对
$ openssl genrsa -out server.key 2048
使用服务器密钥创建证书签名请求,发送给假 CA 进行身份验证
$ openssl req -new -key server.key -out server-cert-request.csr -sha256
localhost
或您用于连接到 mqtt 代理的确切域名现在,您作为假 CA,收到服务器的签名请求。您已经验证了服务器的真实身份(在本地主机上运行的 MQTT 代理),因此创建一个新证书并使用您的虚假授权的所有权力对其进行签名。
$ openssl x509 -req -in server-cert-request.csr -CA ca-root-cert.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360
现在您拥有了所需的一切。确保(如 Steve 的教程中所示)Mosquitto 正在
mosquitto.conf
中加载以下内容:
listener 8883
cafile certs\ca-root-cert.crt
keyfile certs\server.key
certfile certs\server.crt
确保 paho-mqtt 正在加载假 CA 的根证书。
client1.tls_set(ca_certs="ca-root-cert.crt")
这就是它如何知道 mosquitto 的
server.crt
是由“真实且可信的权威机构”合法签名的,而不是“自签名的”,因此不受信任。 Mosquitto 和 paho 现在应该能够安全地连接和通信。
在此过程中,您能否向我解释一下 CA、客户端(在本例中为 Paho)和 Mosquitto 证书是什么?谢谢