SSL/TLS簡介
SSL協定工作在傳輸層與應用層協定之間,為資料通訊提供安全支援。TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任務組)制定的一種新的協定,它建立在SSL 3.0協定規範之上。
SSL/TLS協定提供的服務主要有:
①認證用戶端和伺服器,以確定資料收發對象的合法性;
②加密資料,以確定資料包的完整;
③保證資料的正确性,避免傳輸過程中資料被篡改。
密鑰協商過程——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/藍牙子產品-成都億佰特電子科技有限公司官網