如何使用Toit连接AWS IoT Core并实现MQTT消息发布订阅?
Toit连接AWS IoT Core的MQTT TLS配置疑问解答
场景背景
已完成运行Toit的ESP32与树莓派mosquitto的非TLS MQTT通信,现在尝试对接AWS IoT Core实现MQTT消息收发。已安装Toit根证书包:
jag pkg install github.com/toitware/toit-cert-roots@v1
创建TLS Transport时已将根证书改为certificate_roots.AMAZON_ROOT_CA_1,但不清楚设备证书和私钥的指定方式,针对两个疑问解答如下:
疑问1:是否通过--certificate参数指定设备证书和私钥?如果是,如何创建Certificate对象?
是的,设备证书和私钥就是通过--certificate参数传递的。你需要用Toit的crypto库,从PEM格式的证书和私钥文件内容构造Certificate对象,步骤如下:
- 导入所需依赖包:
import crypto import mqtt import network import github.com/toitware/toit-cert-roots as certificate_roots
- 读取设备证书和私钥文件(假设证书文件名为
device.crt,私钥文件名为device.key,已上传到ESP32的文件系统中):
// 读取PEM格式的设备证书内容 device_cert_pem := File.read "device.crt" // 读取PEM格式的设备私钥内容(如果私钥有密码,需要额外传入密码参数) device_key_pem := File.read "device.key"
- 构造
Certificate对象:
// 无密码的私钥直接传入证书和私钥内容 certificate := crypto.Certificate.from_pem device_cert_pem device_key_pem // 如果私钥有密码,使用带密码的构造方法: // certificate := crypto.Certificate.from_pem device_cert_pem device_key_pem --password="your-key-password"
- 创建TLS Transport时传入该
Certificate对象:
network_interface := network.default_interface aws_iot_endpoint := "your-aws-iot-core-endpoint" transport := mqtt.TcpTransport.tls network_interface --host=aws_iot_endpoint --port=8883 --root_certificates=[certificate_roots.AMAZON_ROOT_CA_1] --server_name=aws_iot_endpoint --certificate=certificate
疑问2:是否需要两次指定--certificate参数?
不需要。一个Certificate对象已经同时包含了设备证书和对应的私钥信息,只需要在创建TLS Transport时传入一次--certificate参数即可。
内容的提问来源于stack exchange,提问作者A. Saunders
相关产品推荐
相关产品推荐

