哪个 X.509 证书用于 NodeMCU SSL 连接?

Which X.509 certificate to use for NodeMCU SSL connections?

哇塞,SSL 认证太厉害了!

我正在使用 NodeMCU 设备 (ESP8266) 设备通过 MQTT 协议安全地连接到 Microsoft Azure IoT Hub。

Microsoft 提供使用自签名 X.509 证书授权客户端的功能。

这里有详细解释:Using X.509 Certificates with IoT Hub

我按照 Microsoft Azure 提供的示例,使用 OpenSSL 生成了我的自签名 X.509 证书。

我尝试使用示例 Python 脚本作为客户端测试连接,使用我的新证书,效果很好。所以我知道这个过程是成功的,因为它已经过测试并且可以正常工作,而且我能够发布和订阅我的 IoT 中心。

为了让 NodeMCU 设备作为客户端连接到 IoT 中心,我需要加载证书以进行身份​​验证。 NodeMCU 提供了将 单个 CA 证书(PEM 格式)加载到操作系统中的工具。

此处记录:NodeMCU TLS Documentation

问题是,我应该使用哪个证书?

我尝试了 OpenSSL 输出中的一些组合,但 none 似乎导致握手成功。我正在探索并希望在这个阶段能够得到一些了解他们东西的人的意见。

令人鼓舞的消息是 NodeMCU 将证书识别为 X.509 证书,但验证失败。所以这让我相信我加载了不正确的证书...

-0x2700 MBEDTLS_ERR_X509_CERT_VERIFY_FAILED

Certificate verification failed, e.g. CRL, CA or signature check failed.

您需要在 NodeMCU 端使用 RSA 客户端证书和私钥来使用 X.509 身份验证对客户端进行身份验证。

您可以将 PEM 格式的证书和私钥放在 NodeMCU 闪存中,并将它们加载到 SRAM 中。将证书和私钥包含在 "EOF(" ")EOF" 标签中是个好主意。

希望您使用的是 ESP8266 的 Arduino 核心,您可以使用 BearSSL 为传输层格式化证书文件并与 WiFiClientSecure 对象关联,如下所示:

BearSSL::WiFiClientSecure espClient;

BearSSL::X509List serverCertList(getCertificate());
BearSSL::PrivateKey serverPrivKey(getPrivateKey());
espClient.setClientRSACert(&serverCertList, &serverPrivKey);

其中,您应该定义 getCertificate() 和 getPrivateKey() 方法以从闪存中读取证书(或在此处传递包含 PEM 格式证书和私钥的字符数组)。在此之后,如果您的证书和私钥属于有效链,您将能够通过服务器验证客户端。