ESP32 SSL-соединение работает, когда сертификат CA является константой, но не при чтении из файла - PullRequest
0 голосов
/ 08 июня 2019

У меня есть следующий код Arduino, который я использую с ESP32:

  if(!SPIFFS.begin(true)) {
    Serial.println("Error mounting SPIFFS.");
  }

  File file = SPIFFS.open("/root.cer");

  if(!file) {
    Serial.println("Error opening the file.");
  }


  Serial.println("CA Root certificate: ");

  String ca_cert = file.readString();

  Serial.println(ca_cert);
  espClient.setCACert(ca_cert.c_str());

  file.close();

Это соответствующий код для загрузки файла и установки сертификата CA WiFiClientSecure.Этот код не работает.

Однако, если я заменю espClient.setCACert(ca_cert.c_str()); на espClient.setCACert(ROOTCERT);, где ROOTCERT определяется следующим образом:

#define ROOTCERT "-----BEGIN CERTIFICATE-----\n" \
"MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/\n" \
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \
"DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow\n" \
"PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD\n" \
"Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n" \
"AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O\n" \
"rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq\n" \
"OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b\n" \
"xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw\n" \
"7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD\n" \
"aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\n" \
"HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG\n" \
"SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69\n" \
"ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr\n" \
"AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz\n" \
"R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5\n" \
"JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo\n" \
"Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n" \
"-----END CERTIFICATE-----\n" 

Код работает.

Строка ROOTCERT берется непосредственно из файла сертификата, поэтому они должны быть идентичны.

Файл сертификата был загружен и экспортирован с помощью экспортера сертификатов Windows.Я пытался преобразовать окончания строк безрезультатно.

РЕДАКТИРОВАТЬ: Я нашел подсказку.

Если я сделаю следующее:

String constString = ROOTCERT;
espClient.setCACert(constString.c_str());

Это также делаетне работает.

И я добавил этот код:

 if(strcmp(constString.c_str(), ROOTCERT))
     Serial.println("Constant and converted string are equal.");
   else
     Serial.println("Constant and converted string are different.");

И он печатает «Константа и преобразованная строка отличаются.»

Так что, похоже,какая-то проблема с тем, как .c_str() делает вещи?Я понятия не имею, что это может быть, хотя.При выводе на консоль .c_str(), ROOTCERT и ca_cert String s кажутся ИДЕНТИЧНЫМИ.

Я здесь совершенно сбит с толку.

ПоворотыЯ использовал strcmp() неправильно.Вещи все еще не работают.

1 Ответ

0 голосов
/ 09 июня 2019

После возни я исправил это.

Так что .c_str() - это просто еще один способ указать на внутренний буфер объекта String.

Каким-то образом это все испортило,Использование этого кода исправило его.

char *dest;

dest = (char *)malloc(sizeof(char) * (ca_cert.length()+1));
strcpy(dest, ca_cert.c_str());

espClient.setCACert(dest);
...