python - Mqtt TLS 证书验证失败 : self signed certificate

标签 python ssl mqtt paho

我正在尝试为 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 是值得信任的。

您的假证书颁发机构的根证书(您提供给 paho 的 ca.crt 文件)可能未正确签名或生成,或者 Mosquitto 使用的证书未正确签名。无论哪种方式,您可能都需要重新开始整个过程​​才能 100% 确定一切都正确完成。

  1. 生成假证书颁发机构 (CA) 的签名 key
    $ openssl genrsa -des3 -out ca.key 2048

  2. 为假 CA 生成证书签名请求
    $ openssl req -new -key ca.key -out ca-cert-request.csr -sha256

    • 给组织起一个像“Fake Authority”这样的名称,不要输入通用名称(因为您的假 CA 实际上并不存在于具有名称的服务器上)
  3. 创建假 CA 的根证书
    $ openssl x509 -req -in ca-cert-request.csr -signkey ca.key -out ca-root-cert.crt -days 365 -sha256

  4. 创建服务器/mqtt 代理的 key 对
    $ openssl genrsa -out server.key 2048

  5. 使用服务器 key 创建证书签名请求以发送给假 CA 进行身份验证
    $ openssl req -new -key server.key -out server-cert-request.csr -sha256

    • 为组织命名,例如“Localhost MQTT Broker Inc.”。并且通用名称应该是 localhost 或您用来连接到 mqtt 代理的确切域
  6. 现在作为假 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 现在应该能够安全地连接和通信。

关于python - Mqtt TLS 证书验证失败 : self signed certificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70110392/

相关文章:

java - 如何在MQTT消息到达之前保持线程

android - 使用 kivy 使用 G+ (Google+) 注册

python - 在多列上过滤 Pandas 数据框的最快方法

python - Pandas 按组转置数字列

java - Android:通过 sslsocket 连接发送多条消息

java - 转换 PEM 证书以在 JAVA Spring Framework 中使用

python - df.mean 不是该系列的真正平均值吗?

qt - QSslCertificate::importPkcs12 无法解析 PFX 文件

c - MQTTAsync_onSuccess 和 MQTTAsync_deliveryComplete 回调有什么区别?

c++ - MQTT C++客户端