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

4
我正在尝试实现MQTT的TLS加密,并按照下面链接中的教程进行操作: http://www.steves-internet-guide.com/mosquitto-tls/ 我严格按照openssl生成证书的指示进行操作,并将其复制到mqtt的位置,修改了mqtt的配置文件并重启了服务。但当我尝试使用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位于项目目录中。

1个回答

8
您所接收到的消息表明,代理服务器证书不受信任(因为是自签名的),因此paho无法正确地告知它是可信的。
可能您伪造的证书颁发机构的根证书(ca.crt文件)未经正确签名或生成,或者Mosquitto使用的证书未被正确签名。无论哪种情况,您可能需要重新开始整个过程,以确保一切都做得正确。
以下是操作步骤:
1. 生成伪证书颁发机构(CA)签名密钥: ``` $ openssl genrsa -des3 -out ca.key 2048 ```
2. 为伪CA生成证书签名请求: ``` $ openssl req -new -key ca.key -out ca-cert-request.csr -sha256 ``` 给组织命名例如"伪授权机构",不要输入公共名称(因为您的伪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 ``` 将组织命名为"本地主机MQTT代理公司",公共名称应为localhost或您用于连接mqtt代理的确切域。
6. 现在作为伪CA,您收到了服务器对您签名的请求。您已经验证了服务器是它所说的那样(在localhost上运行的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正在加载以下内容: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应该能够安全连接和通信。

请注意,为了使其在不设置密码或其他用户身份验证方法的情况下正常工作,Mosquitto需要将allow_anonymous设置为true - Adam Howell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接