【问题标题】:MQTT publishing to AWS IoT CoreMQTT 发布到 AWS IoT Core
【发布时间】:2022-06-12 05:50:34
【问题描述】:

我正在尝试使用 paho-mqtt 将数据框中的数据(最初在 txt 文件中)发布到 AWS IoT Core。我的发布脚本设置如下:

# paho mqtt
import paho.mqtt.client as mqtt

clientID = "iotconsole-somenumber-0"
broker = "alphanumeric-ats.iot.us-west-1.amazonaws.com"
port = 8883

pub = mqtt.Client(clientID)
pub.tls_set("certs/AmazonRootCA1.pem", certfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_certificate.pem.crt", keyfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_private.pem.key")
pub.connect(broker, port)
pub.publish("awsiot_test", dataframe, qos = 1)

但是,当我运行此脚本时,我收到以下错误。我认为我的东西证书做错了。但不能归零。

  File ~\PyProj\projfolder\code.py:9 in <module>
    pub.tls_set("certs/AmazonRootCA1.pem", certfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_certificate.pem.crt", keyfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_private.pem.key")

  File ~\anaconda3\lib\site-packages\paho\mqtt\client.py:796 in tls_set
    context.load_cert_chain(certfile, keyfile, keyfile_password)

FileNotFoundError: [Errno 2] No such file or directory

我认为这是一个证书文件 -/_ 问题或扩展问题。但是,还没有找到解决办法。我该如何解决?谢谢!

【问题讨论】:

  • 失败的代码是context.load_cert_chain(certfile, keyfile, keyfile_password);引用的文件(证书文件/密钥文件)(名称很长!)是否存在?工作目录是否符合您的预期(调试时使用完整路径可能会有所帮助,例如/home/AV111/PyProj/projfolder/certs/a0...)。
  • @Brits,密钥文件存在,我也尝试使用完整路径。还是一样的错误。
  • 请显示 ls -l certs 的结果(假设 linux - 想要 certs 文件夹的内容)。您的 example 使用较短的文件名将更具可读性。

标签: amazon-web-services ssl mqtt aws-iot paho


【解决方案1】:

根据 cmets,您看到的错误是由对 context.load_cert_chain(certfile, keyfile, keyfile_password); 的调用触发的,并表明其中一个文件(certs/AmazonRootCA1.pem 和/或 certs/a0c9496....afd4f67f_certificate.pem.crt)不存在(这可能与权限有关) .

为了帮助显示最可能的原因,我复制并运行了您的代码,结果相同:

python3 app.py
Traceback (most recent call last):
  File "/workspaces/test/app.py", line 9, in <module>
    pub.tls_set("certs/AmazonRootCA1.pem", certfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_certificate.pem.crt", keyfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_private.pem.key")
  File "/usr/local/pip-global/paho/mqtt/client.py", line 796, in tls_set
    context.load_cert_chain(certfile, keyfile, keyfile_password)
FileNotFoundError: [Errno 2] No such file or directory

然后我创建了证书文件:

mkdir certs 
touch certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_certificate.pem.crt

然后再次运行应用程序(不做其他更改):

python3 app.py
Traceback (most recent call last):
  File "/workspaces/test/app.py", line 9, in <module>
    pub.tls_set("certs/AmazonRootCA1.pem", certfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_certificate.pem.crt", keyfile = "certs/a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_private.pem.key")
  File "/usr/local/pip-global/paho/mqtt/client.py", line 796, in tls_set
    context.load_cert_chain(certfile, keyfile, keyfile_password)
ssl.SSLError: [SSL] PEM lib (_ssl.c:4044)

您会注意到现在有一​​个不同的错误(证书现在存在但不是有效的证书)。添加有效的crt 文件将导致No such file or directory 错误再次出现(由于尝试加载密钥文件)。

为了完成示例,我生成了一个 test certificate 并将证书放入 AmazonRootCA1.pema0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_certificate.pem.crt 并将密钥放入 a0c94969f1e7d914d6fe54425d772e8d4611a4710d460e9f56374ea0afd4f67f_private.pem.key 并运行应用程序:

python3 app.py
Traceback (most recent call last):
  File "/workspaces/test/app.py", line 10, in <module>
    pub.connect(broker, port)
  File "/usr/local/pip-global/paho/mqtt/client.py", line 914, in connect
    return self.reconnect()
  File "/usr/local/pip-global/paho/mqtt/client.py", line 1044, in reconnect
    sock = self._create_socket_connection()
  File "/usr/local/pip-global/paho/mqtt/client.py", line 3685, in _create_socket_connection
    return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
  File "/usr/local/lib/python3.9/socket.py", line 823, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "/usr/local/lib/python3.9/socket.py", line 954, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

这表明拥有有效的证书/密钥可以导致函数成功完成(它现在正在尝试连接到alphanumeric-ats.iot.us-west-1.amazonaws.com,这将失败)。

您的问题没有提供足够的信息来进行任何进一步的调查;如果您仍然遇到问题,请尝试复制上述过程,这很可能有助于找到原因。

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2021-08-17
    • 1970-01-01
    • 2021-03-24
    • 2021-03-24
    • 2017-02-22
    • 2021-07-14
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多