使用 ESP32 與服務器通信的最安全協議是什麼?HTTPS!
如果你熟悉 ESP32 上的 HTTP 通信,HTTPS 實現起來並不難。只要對程式碼進行 3 個地方修改,您就完成了:
注意:如果您想大致了解 HTTPS 的工作原理,這篇文章會有所幫助
文章目錄標題
第 1 步:將 WiFiClient 更改為 WiFiClientSecure
WiFiClient client;
變更為
WiFiClientSecure client;
您還需要包含 WiFiClientSecure 庫和 WiFiClient 庫。
#include <WiFi.h>
#include <WiFiClientSecure.h>
第 2 步:將端口從 80 更改為 443
conn1 = client.connect(server,80);
變更為
conn1 = client.connect(server,443);
第 3 步:將主機 URL 從 http:// 更改為 https://
client.println("GET http://www.exampleserver.com/HTTP/1.0");
變更為
client.println("GET https://www.exampleserver.com/HTTP/1.0");
可選步驟 4:設置服務器的 CA 證書
如果您遵循了前 3 個步驟,它將確保您的通信是安全的。這個額外的步驟可確保您與預期的收件人進行通信。安全地發送消息是一部分,而將消息發送給正確的收件人是另一部分。如果有其他人冒充預期收件人的風險,此步驟可以幫助您避免您的郵件落入壞人之手。
如果您想知道如何為您的服務器獲取 CA 證書,這裡提供了Google Chrome 和Mozilla Firefox 的教程。獲得 CA 證書後,您需要將其硬編碼到您的代碼中並添加所需的檢查。通過這個額外的步驟,如果服務器的 CA 證書與硬編碼的 CA 證書不匹配,ESP32 將停止通信。該client.setCACert()
函數啟用了這種比較,如下面的代碼片段所示。
#include
const char* ssid = “your_ssid”;
const char* password = “your_password”;
//Given below is the CA Certificate of google.com. Replace it with the CA Certificate of your server
const char* ca_cert = \
“—–BEGIN CERTIFICATE—–\n” \
“MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G\n” \
“A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp\n” \
“Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1\n” \
“MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG\n” \
“A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\n” \
“hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL\n” \
“v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8\n” \
“eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq\n” \
“tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd\n” \
“C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa\n” \
“zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB\n” \
“mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH\n” \
“V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n\n” \
“bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG\n” \
“3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs\n” \
“J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO\n” \
“291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS\n” \
“ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd\n” \
“AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\n” \
“TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n” \
“—–END CERTIFICATE—–\n”;
WiFiClientSecure client;
void setup(){
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(“.”);
}
Serial.println(“”); Serial.print(“WiFi connected to: “);Serial.println(ssid); Serial.println(“IP address: “); Serial.println(WiFi.localIP());
client.setCACert(ca_cert);
delay(2000);
}
void loop(){
SendData(“www.myserver.com”, 443);
delay(5000);
}
將服務器的 CA 憑證新增到代碼後,您可以驗證即使更改 CA 證書的一個字符也會導致通信失敗。
關於 CA 憑證的注意事項
請注意,CA 憑證的有效期通常少於或等於一年。如果你想在現場部署多年的 ESP32 設備,如果服務器的 CA 憑證過期,它們可能無法工作。一種解決方法是使用具有更長有效期的根 CA 憑證(大約 15 年)。您可以在代碼中使用它以獲得更長的有效性。要閱讀有關根 CA 憑證以及如何獲取它們的更多信息,請參閱此。
有效載荷大小限制
雖然在 ESP32 上將 HTTP 請求轉換為 HTTPS 非常簡單,但您應該注意一個限制。最大有效載荷大小為 16 kB。ESP32 上的 TLS 加密最大支持 16384 字節。如果您的有效負載大小超過此值,您將不得不將有效負載拆分為多個塊。
最後
在 ESP32 上將簡單的 HTTP 請求轉換為 HTTPS 的過程非常簡單。只要有可能,您可以使用 HTTPS 為您的 ESP32 設備增加更多可信度,並吹噓安全方面。如果您有任何其他問題,請隨時與我們聯繫。