2

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

有什么我错过的吗,例如我是否必须拥有一个完整的钥匙链或其他东西?

提前致谢!

4

1 回答 1

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

于 2018-12-06T14:55:23.490 回答