【问题标题】:Fingerprint Verification with BearSSL on ESP8266 (Arduino IDE)在 ESP8266 (Arduino IDE) 上使用 BearSSL 进行指纹验证
【发布时间】:2018-11-20 00:47:44
【问题描述】:

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

有什么我错过的吗?我必须有一个完整的钥匙链还是什么?

提前致谢!

【问题讨论】:

    标签: ssl encryption arduino-esp8266 fingerprinting


    【解决方案1】:

    请注意,verify() 的“host”参数必须与证书公用名匹配(在您的情况下为 *.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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多