我正在使用来自Arduino提供的Librarys的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方法允许自签名证书。
我有什么遗漏,例如我必须要有一整个钥匙串吗?
提前致谢!
答案 0 :(得分:0)
请注意,verify()的“主机”参数必须与证书通用名称(在您的情况下为* .github.com或api.github.com)匹配:
测试:openssl s_client -connect api.github.com:443
输出:0 s:/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=*.github.com