0

问题:我需要使用 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 以外的其他方法,但我需要使用我的安全元素。

4

0 回答 0