Я использую 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.
Есть ли что-то, что я пропустил, например, мне нужно иметь целый брелок или что-то?
Заранее спасибо!