"certificate verify failed" 将 AWS IoT 与本地 Mosquitto MQTT 桥接时

"certificate verify failed" when bridging AWS IoT with local Mosquitto MQTT

我在本地 raspberry pi 上有一个 mosquitto MQTT,工作起来非常棒。 我在 AWS IoT 上创建了一个同样有效的 MQTT 代理。

在我的 raspberry pi 上,我可以使用命令 mosquitto_pub 和 mosquitto_sub 在 AWS 代理 "manually" 上进行连接、发布和订阅。 当我手动执行此操作时,我会使用所有证书和东西。我使用的命令是:

mosquitto_pub --cafile amazonCA1.pem --cert certificate.cert --key private.key -h XXXXXXXXXXXXXXXXXX.amazonaws.com -p 8883 -q 1 -d -t "iot/test" -m "testing message"

所以,我认为问题不在证书上。

问题是当我更改配置以使用 "bridge mode" 时,我在 mosquitto 日志中收到以下消息:

1584371971: Connecting bridge (step 1) awsiot (XXXXXXXXXXXXXXXXXXXXX.amazonaws.com:8883)
1584371972: Connecting bridge (step 2) awsiot (XXXXXXXXXXXXXXXXXXXXX.amazonaws.com:8883)
1584371972: Bridge bridgeawsiot sending CONNECT
1584371972: OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
1584371972: Socket error on client local.bridgeawsiot, disconnecting.
1584371977: Bridge local.bridgeawsiot doing local SUBSCRIBE on topic #

这是我的 mosquitto.conf:

pid_file /var/run/mosquitto.pid

persistence true persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log log_type all
#log_dest topic

log_type error log_type warning log_type notice log_type information

connection_messages true log_timestamp true

include_dir /etc/mosquitto/conf.d

password_file /etc/mosquitto/passwordfile allow_anonymous false

这是我的 /etc/mosquitto/conf.d/bridge.conf

connection awsiot
address XXXXXXXXXXXXXXXXXXXX.amazonaws.com:8883

# Specifying which topics are bridged
topic # both 1

# Setting protocol version explicitly
bridge_protocol_version mqttv311
bridge_insecure false

# Bridge connection name and MQTT client Id,
# enabling the connection automatically when the broker starts.
cleansession true
clientid bridgeawsiot

start_type automatic
notifications false
log_type all


# =================================================================
# Certificate based SSL/TLS support
# -----------------------------------------------------------------
#Path to the rootCA
bridge_cafile /home/pi/certs/amazonCA1.pem

# Path to the PEM encoded client certificate
bridge_certfile /home/pi/certs/certificate.cert

# Path to the PEM encoded client private key
bridge_keyfile /home/pi/certs/private.key

所以,总的来说,问题是:当我手动 connect/publish/subscribe 时,一切正常...但是当我使用网桥 conf 文件时,出现错误:

OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

有什么建议吗? 在我的本地代理 (raspberry pi) 上使用 username/pw 的身份验证方法和在 AWS 上使用证书身份验证有任何问题吗?

谢谢

好的,我不知道我做了什么,我只知道它解决了问题。

起初我在 Ubuntu 虚拟机上全新安装了 mosquitto,一切正常。

然后我从 raspberry pi 中卸载了 Mosquitto 并重新安装。按照我配置 Ubuntu VM 的方式配置它,但仍然没有成功。我开始认为问题出在我的 raspbian 图像上......但是在对配置进行了一些调整之后,将证书文件从一个目录移动到另一个目录,更改它们的权限,更改 bridge.conf 文件目录和东西...它开始工作,现在没问题了。

因此,如果您以后遇到此问题:可能只是文件或目录的权限问题。

编辑(一天后):当我试图在另一个经纪人上复制同样的东西时,我做了同样的事情,但是当我的本地经纪人与AWS IoT 桥连接丢失(下面的消息。这次没有证书错误):

1584456917: Bridge local.bridgeawsiot doing local SUBSCRIBE on topic #
1584456917: Connecting bridge (step 1) awsiot (XXXXXXXXXXXXXXX.amazonaws.com:8883)
1584456918: Connecting bridge (step 2) awsiot (XXXXXXXXXXXXXXX.amazonaws.com:8883)
1584456918: Bridge bridgeawsiot sending CONNECT
1584456918: Received CONNACK on connection local.bridgeawsiot.
1584456918: Bridge local.bridgeawsiot sending SUBSCRIBE (Mid: 2, Topic: #, QoS: 0, Options: 0x00)
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))
1584456918: Sending PUBLISH to local.bridgeawsiot (d0, q0, r1, m0, 'XXXXX/XXXXX/XXXXX/LWT', ... (6 bytes))

1584456918: Received SUBACK from local.bridgeawsiot
1584456919: Socket error on client local.bridgeawsiot, disconnecting.

我正在使用桥接所有主题:

topic # both 1

I THINK 我一连接到网桥,许多设备就发布了很多消息,连接中断了。 所以在我更改桥接主题后一切都是正确的

topic iot/test both 1

[另一个编辑:3 天后] 当我使用 "topic # both 1": 时,我发现了它断开连接的原因:因为我的一个设备正在发送一条 RETAIN 标志设置为 TRUE 的消息。

AWS IoT 的文档说它不支持 RETAIN TRUE,如果以这种方式发送任何消息,AWS IoT Broker 将断开连接。

rootCA.pem 无效。 rootCA.pem 文件的 how-to-bridge-mosquitto-mqtt-broker-to-aws-iot, they reference AmazonRootCA1.pem 之后。但是,使用 openssl 进行验证会出错:

openssl s_client -connect <endpoint>.iot.us-east-1.amazonaws.com:8443 -CAfile rootCA.pem  -cert cert.crt -key private.key
...
verify error:num=20:unable to get local issuer certificate

OpenSSL Verify return code: 20 (unable to get local issuer certificate) 有一些关于 openssl 错误的线索,其中强调了 CAfile 路径。

在另一个配置网桥的教程中:Arduino-AWS-IOT-Bridge,rootCA.pem 文件有不同的参考: Public-Primary-Certification-Authority-G5.pem。最后,使用新 rootCA.pem returns:

尝试 openssl s_client 命令
verify return:1