天天看點

漲知識!講解ESP32 SSL/TLS應用

作者:億佰特物聯網應用

SSL/TLS簡介

SSL協定工作在傳輸層與應用層協定之間,為資料通訊提供安全支援。TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任務組)制定的一種新的協定,它建立在SSL 3.0協定規範之上。

SSL/TLS協定提供的服務主要有:

①認證用戶端和伺服器,以確定資料收發對象的合法性;

②加密資料,以確定資料包的完整;

③保證資料的正确性,避免傳輸過程中資料被篡改。

密鑰協商過程——TLS握手

漲知識!講解ESP32 SSL/TLS應用

1用戶端請求(ClientHello)

在TLS握手階段,用戶端首先向服務端提供以下資訊:

①支援的協定版本,比如TLS 1.1版

②用戶端生成的随機數

③用戶端支援的加密方法,比如DES、3DES、AES等

④支援的壓縮方法

2 伺服器回應(SeverHello)

服務端在接收到用戶端的Client Hello之後伺服器的回應包含以下内容:

①确定在後續通訊過程中需要使用的TLS協定版本

②一個伺服器生成的随機數,稍後用于生成"對話密鑰"

③伺服器生成的随機數

④伺服器證書

3 用戶端回應(Certificate Verify)

(1)Client Key Exchange

如果服務端需要對用戶端進行驗證,在用戶端收到服務端的 Server Hello 消息之後,首先需要向服務端發送用戶端的證書,讓服務端來驗證用戶端的合法性。

(2)Certificate Verify

接着,用戶端需要對服務端的證書進行檢查,然後,向伺服器發送下面三項資訊:

①一個用伺服器公鑰加密的随機數

②編碼改變通知,表示随後的資訊都将用雙方商定的加密方法和密鑰發送

③用戶端握手完成的通知(即前面所有通訊内容的hash值)

4 伺服器的最後回應(Server Finish)

服務端會使用協商出來的密鑰,加密一段finish消息發送給用戶端,用戶端若能正确解析,則證明協商成功,可以正常進行後續的應用層資料收發。

5應用資料傳輸

在所有的握手階段都完成之後,就可以開始傳送應用資料了。

在ESP32上建立SSL/TLS工程

可以參考IDF的示例工程 “https_mbedtls” “mqtt_ssl_example_test”等

在TLS連接配接過程中,應用層開發主要需要關注的是:

(1)CA憑證,TLS在驗證伺服器證書時需要用伺服器的證書釋出機構(CA)的證書(即根證書),該證書是CA給自己頒發的證書,且通過該證書為伺服器頒發證書,客服端通過根證書驗證伺服器下發的證書。浏覽器内置了根證書鍊,是以我們通過浏覽器上網時,不需要手動添加證書。ESP32上面可以選擇将SDK内置根證書鍊編譯到程式内部,這樣就能在面對大部分伺服器時都能不需要指定根證書,但若要添加或者證書更新,則需要下載下傳新的根證書捆綁包編譯後,更新程式才能替換。同時也可以配置目标伺服器的CA憑證。

(2)用戶端證書與公鑰,若要使用TLS雙向驗證,則需要伺服器下發用戶端證書與用戶端公鑰,在ESP32中若伺服器要驗證用戶端證書,僅需将伺服器為用戶端生成的證書與密鑰填入TLS庫相應位置。

關于ESP32的SSL/TLS需要補充的是:

(1)crt_bundle_attach與esp_crt_bundle_attach,在初始化esp_tls_cfg_t結構體的時候,若設定了crt_bundle_attach的函數為esp_crt_bundle_attach,則TLS庫在校驗伺服器證書的時候,會從編譯進代碼區的CA捆包來查找并驗證伺服器證書,而不需要手動設定,具體參考樂鑫手冊(若使用證書捆綁包,程式會大60k左右)

esp_tls_cfg_t cfg = {

.clientcert_buf = (const unsigned char *) client_cert_pem_start,

.clientcert_bytes = sizeof(client_cert_pem_start),

.clientkey_buf = client_key_cert_pem_start,

.clientkey_bytes = sizeof(client_key_cert_pem_start),

.crt_bundle_attach = esp_crt_bundle_attach,

};

(2)若要跳過伺服器證書驗證,通過 idf.py menuconfig 配置使能 Component config->ESP-TLS->[*] Allow potentially insecure options->[*] Skip server ...,并且 tls config 結構體中去掉 cert_pem 證書。

(3)https的雙向證書驗證,與自簽證書問題。

①伺服器需要配置一個受信任的證書;

②用戶端的證書需要用戶端通過自簽名CA,且給用戶端生成證書與密鑰;

③skip_common_name,可以跳過對于伺服器證書的"CN"字段的驗證,若使能該設定,對于伺服器自簽證書,可能會有幫助。

序列槽伺服器_數傳電台_4G DTU_遙控開關_LoRa/ZigBee/WiFi/藍牙子產品-成都億佰特電子科技有限公司官網