Mqtt TLS 证书验证失败:自签名证书

Mqtt TLS certificate verify failed : self signed certificate

我正在尝试为 mqtt 实施 TLS,并已遵循下面 link 中的教程 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) 签名密钥
    $ 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 代理的密钥对
    $ openssl genrsa -out server.key 2048

  5. 使用服务器密钥创建证书签名请求发送给假 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

现在你拥有了你需要的一切。确保(如史蒂夫的教程)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 现在应该能够安全地连接和通信。