在ESP8266(Arduino IDE)上使用BearSSL进行指纹验证

时间:2018-06-10 17:37:26

标签: ssl encryption arduino-esp8266 fingerprinting

我正在使用来自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方法允许自签名证书。

我有什么遗漏,例如我必须要有一整个钥匙串吗?

提前致谢!

1 个答案:

答案 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