簡體   English   中英

當CA證書是常量時,ESP32 SSL連接有效,但從文件讀取時則不行

[英]ESP32 SSL connection works when CA Certificate is a constant, but not when read from a file

我有一個與ESP32一起使用的以下Arduino代碼:

  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();

這是用於加載文件和設置WiFiClientSecure的CA證書的相關代碼。 此代碼不起作用。

但是,如果我替換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都顯示為IDENTICAL。

我在這里完全糊塗了。

結果我錯誤地使用了strcmp() 事情仍然沒有奏效。

亂搞之后,我修好了。

因此.c_str()只是指向String對象的內部緩沖區的另一種方式。

不知怎的,這讓事情搞得一團糟。 使用此代碼修復它。

char *dest;

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

espClient.setCACert(dest);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM