问题:我需要使用 paho mqtt 从 python 客户端连接到 AWS iot 代理。需要 TLS 连接才能连接到 AWS iot,但我的证书存储在安全元素 (ATECC608) 中,因此我无法将私钥保存在文件中以便由 paho 加载以处理 tls 连接。我必须使用 PKCS#11 才能访问安全元素,但我找不到任何使用 PKCS#11 来检索密钥的库。
解决方案:我发现 nginx 可以处理 PKCS#11,所以我所做的就是将其配置为代理,其唯一目的是与 AWS iot 建立 TLS 连接,这样客户端无需 tls 即可连接。
它在我的本地设置中与蚊子代理一起工作,但是当我尝试使用 AWS iot 时,连接已建立,但一旦我尝试传输某些内容,就会断开连接。
nginx.conf
upstream xxx.iot.us-east-2.amazonaws.com {
server xxx.iot.us-east-2.amazonaws.com:8443;
}
server {
listen 1883;
proxy_pass xxx.iot.us-east-2.amazonaws.com;
proxy_ssl on;
proxy_ssl_certificate /home/root/config/dev.crt;
proxy_ssl_certificate_key "engine:pkcs11:pkcs11:token=MCHP;object=device;type=private";
proxy_ssl_protocols TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
proxy_ssl_trusted_certificate /home/root/config/AmazonRootCA1.pem;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
}
paho 尝试连接时的日志:
2021/11/04 11:13:00 [info] 1013#1013: *1 client 127.0.0.1:44306 connected to 0.0.0.0:1883
2021/11/04 11:13:00 [info] 1013#1013: *1 proxy 172.18.100.53:57340 connected to 3.131.232.87:8883
2021/11/04 11:13:12 [info] 1013#1013: *1 upstream disconnected, bytes from/to client:2/0, bytes from/to upstream:0/2
2021/11/04 11:13:15 [info] 1013#1013: *3 client 127.0.0.1:44310 connected to 0.0.0.0:1883
2021/11/04 11:13:15 [info] 1013#1013: *3 proxy 172.18.100.53:47318 connected to 18.116.149.245:8883
2021/11/04 11:13:16 [info] 1013#1013: *3 upstream disconnected, bytes from/to client:5/0, bytes from/to upstream:0/5
TLS 连接似乎已建立,但当 paho 尝试发送数据时,它会断开连接。on_receive 事件不会触发,唯一触发的事件是 on_disconnect:
这是python代码:
thing_name = '<actual_thing_name>'
client = mqtt.Client(client_id=thing_name)
client.enable_logger(logger)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect("localhost", 1883, 60)
client.loop_forever()
至于 AWS iot,我创建了一个“允许一切”策略,以确保 AWS 不会阻止我的连接。
我对nginx做错了什么吗?我是否需要额外的配置才能使其与 aws iot 一起使用?我也愿意尝试 nginx 以外的其他方法,但我需要使用我的安全元素。