我正在使用 Arduino 提供的库中的 BearSSL,即 WiFiSecureClient 类。我采用参考实现来获得一个简单的 Python 实现服务器和作为客户端的 ESP8266 板之间的安全 TCP 连接。
我使用 OpenSSL 导出了密钥和证书,并使用它们来提供 Python 套接字 SSL 包装器。一切正常,可以交换消息,但是 WifiSecureClient 无法验证证书。这里是节点的部分代码:
void handle() {
// Use WiFiClientSecure class to create TLS connection
WiFiClientSecure client;
client.allowSelfSignedCerts();
Serial.print("connecting to ");
Serial.println(host);
if (!client.connect(host, httpsPort)) {
Serial.println("connection failed");
return;
}
if (client.verify(fingerprint, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
}
client.print("Some Message");
Serial.println("request sent");
String line;
while (client.connected()) {
line = client.readStringUntil('\n');
}
Serial.println("reply was:");
Serial.println("==========");
Serial.println(line);
Serial.println("==========");
Serial.println("closing connection");
client.stop();
}
如前所述,我可以发送和接收消息(我不知道它们是加密的还是未加密的回退)但是步骤
if (client.verify(fingerprint, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
}
总是失败。指纹是使用 OpenSSL 作为 SHA1 密钥导出的。我通过用另一台 PC 连接到服务器、获取证书并重新计算其指纹来仔细检查了这一点。如果我尝试联系 api.github.com 之类的公共服务器(在示例中是默认设置),则代码可以正常工作。如您所见,我已经通过调用 BearSSL 的适当 API 方法来允许使用自签名证书。
有什么我错过的吗,例如我是否必须拥有一个完整的钥匙链或其他东西?
提前致谢!