Проверка отпечатков пальцев с BearSSL на ESP8266 (Arduino IDE) - PullRequest
0 голосов
/ 10 июня 2018

Я использую BearSSL из предоставленных Arduino библиотек, а именно класс WiFiSecureClient.Я взял эталонную реализацию, чтобы получить безопасное TCP-соединение между простым сервером, реализованным на Python, и платой ESP8266 в качестве клиента.

Я экспортировал ключ и сертификат с помощью OpenSSL и использовал их для передачи оболочки SSL для сокета Python.Все работает нормально, сообщения могут быть обменены, однако сертификат не может быть проверен 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.Я дважды проверил это, подключившись к серверу с другим ПК, выбрав сертификат и пересчитав его отпечаток пальца.Код работает нормально, если я пытаюсь связаться с общедоступным сервером, таким как api.github.com (который был по умолчанию в примере).Как видите, я уже разрешил самозаверяющие сертификаты, вызвав соответствующий метод API BearSSL.

Есть ли что-то, что я пропустил, например, мне нужно иметь целый брелок или что-то?

Заранее спасибо!

1 Ответ

0 голосов
/ 06 декабря 2018

Обратите внимание, что аргумент "host" функции verify () должен соответствовать общему имени сертификата (в вашем случае * .github.com или api.github.com):

Test: openssl s_client -connect api.github.com:443

Выход: 0 s:/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=*.github.com

...