【问题标题】:ValueError: invalid key when connecting to AWS IoT Core with umqtt (Micropython)ValueError:使用 umqtt (Micropython) 连接到 AWS IoT Core 时密钥无效
【发布时间】:2022-11-09 09:20:07
【问题描述】:

几天前,我买了一个 Raspberry Pi Pico W,我正在尝试将它连接到 AWS IoT Core。但是,我在连接到 AWS 时卡住了。

我已经完成了以下步骤:

  • 在 Raspberry Pi Pico W 上安装了 Micropython,这行得通!

  • 创建了一个 AWS 账户。

  • 在 IoT Core 注册了一个“事物”

  • 下载了相应的证书和密钥:(Certificates: AmazonRootCA1.pem, certificate.pem.crt, Keys: public.pem.key & private.pem.key)

  • 创建了一个策略,它允许该策略的所有操作。在 AWS,此策略已激活并具有以下形式:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}
  • 将证书附加到策略。
  • 将注册的事物附加到策略中。
  • 将密钥和证书传输到 Raspberry Pi Pico W。

此后,我使用 Thonny 编写以下代码,尝试将树莓派与 AWS 连接起来。

import time
import network
import urequests
SSID = "XXXX"
PASSWORD = "XXXX"

print("start connecting")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("Connected:", wlan.isconnected())

import sys
import machine
import argparse
from umqtt.simple import MQTTClient

clientId = 'client1'
AWS_ENDPOINT = 'XXXXX.amazonaws.com'
PORT = 8883

certfile = '/certificate.pem.crt'
with open(certfile, 'r') as f:
    cert = f.read()
    
keyfile = '/private.pem.key'
with open(keyfile, 'r') as f:
    key = f.read()

print("Key and Certificate files Loaded")

SSL_PARAMS = {'key': key, 'cert': cert, 'server_side': False}

client = MQTTClient(clientId, AWS_ENDPOINT, port=PORT, keepalive=10000, ssl=True, ssl_params=SSL_PARAMS)

print("Client created")

client.connect()

程序运行到:

客户端.connect()

并给我以下错误:

Traceback (most recent call last):
  File "<stdin>", line 38, in <module>
  File "/lib/umqtt/simple.py", line 61, in connect
ValueError: invalid key

(第 38 行是 client.connect() 语句)

private.pem.key 的格式为:

-----开始 RSA 私钥----- [字符块] -----结束 RSA 私钥-----

我有谁知道我做错了什么?提前感谢您的帮助!! :)

亲切的问候,本杰明

【问题讨论】:

  • 它看起来像 umqtt.simple uses ussl.wrap_socket,我认为它不支持密钥/证书 - 而是通过 keyfile/certfile - 请参阅 the docs

标签: mqtt micropython raspberry-pi-pico aws-iot-core


【解决方案1】:

抱歉 - 派对迟到了。

如果您还没有完成这项工作,您应该尝试使用 OpenSSL 将密钥和证书文件转换为 .DER 格式

openssl x509 -in certificate.pem.crt -out certificate.der -outform DER

openssl rsa -in private.pem.key -out private.key.der -outform DER

`certfile = '/certificate.der'`

`with open(certfile, 'r') as f:`

    `cert = f.read()`

`keyfile = '/private.pem.der'`

`with open(keyfile, 'r') as f:`

    `key = f.read()`

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2022-12-07
    • 1970-01-01
    • 2018-01-25
    • 2021-01-09
    • 2022-10-20
    • 2018-06-11
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多