SSL協(xié)議工作在傳輸層與應用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。TLS 1.0是IETF(Internet工程任務組)制定的一種新的通信協(xié)議,TLS是建立在SSL 3.0協(xié)議規(guī)范之上。
認證客戶端和服務器,以確保數(shù)據(jù)收發(fā)對象的合法性;
加密數(shù)據(jù),以確保數(shù)據(jù)包的完整;
保證數(shù)據(jù)的正確性,避免傳輸過程中數(shù)據(jù)被篡改。
在TLS握手階段,客戶端首先向服務端提供以下信息:
支持的協(xié)議版本,比如TLS 1.1版;
客戶端生成的隨機數(shù);
客戶端支持的加密方法,比如DES、3DES、AES等;
支持的壓縮方法。
服務端在接收到客戶端的Client Hello之后服務器的回應包含以下內(nèi)容:
確定在后續(xù)通訊過程中需要使用的TLS協(xié)議版本;
一個服務器生成的隨機數(shù),稍后用于生成"對話密鑰";
服務器生成的隨機數(shù);
服務器證書。
Client Key Exchange
如果服務端需要對客戶端進行驗證,在客戶端收到服務端的Server Hello消息之后,首先需要向服務端發(fā)送客戶端的證書,讓服務端來驗證客戶端的合法性。
Certificate Verify
接著,客戶端需要對服務端的證書進行檢查,然后,向服務器發(fā)送下面三項信息:
一個用服務器公鑰加密的隨機數(shù)
編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送
客戶端握手完成的通知(即前面所有通訊內(nèi)容的hash值)
服務端會使用協(xié)商出來的密鑰,加密一段finish消息發(fā)送給客戶端,客戶端若能正確解析,則證明協(xié)商成功,可以正常進行后續(xù)的應用層數(shù)據(jù)收發(fā)。
在所有的握手階段都完成之后,就可以開始傳送應用數(shù)據(jù)了。
在ESP32芯片模塊上建立SSL/TLS通信工程
可以參考IDF的示例工程 “https_mbedtls” “mqtt_ssl_example_test”等。
1、CA證書,TLS在驗證服務器證書時需要用服務器的證書發(fā)布機構(gòu)(CA)的證書(即根證書),該證書是CA給自己頒發(fā)的證書,且通過該證書為服務器頒發(fā)證書,客服端通過根證書驗證服務器下發(fā)的證書。瀏覽器內(nèi)置了根證書鏈,所以我們通過瀏覽器上網(wǎng)時,不需要手動添加證書。ESP32上面可以選擇將SDK內(nèi)置根證書鏈編譯到程序內(nèi)部,這樣就能在面對大部分服務器時都能不需要指定根證書,但若要添加或者證書更新,則需要下載新的根證書捆綁包編譯后,更新程序才能替換。同時也可以配置目標服務器的CA證書。
2、客戶端證書與公鑰,若要使用TLS雙向驗證,則需要服務器下發(fā)客戶端證書與客戶端公鑰,在ESP32中若服務器要驗證客戶端證書,僅需將服務器為客戶端生成的證書與密鑰填入TLS庫相應位置。
1、crt_bundle_attach與esp_crt_bundle_attach,在初始化esp_tls_cfg_t結(jié)構(gòu)體的時候,若設置了crt_bundle_attach的函數(shù)為esp_crt_bundle_attach,則TLS庫在校驗服務器證書的時候,會從編譯進代碼區(qū)的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結(jié)構(gòu)體中去掉cert_pem證書,
3.1、服務器需要配置一個受信任的證書
3.2、客戶端的證書需要客戶端通過自簽名CA,且給客戶端生成證書與密鑰
3.3、skip_common_name,可以跳過對于服務器證書的"CN"字段的驗證,若使能該設置,對于服務器自簽證書,可能會有幫助。
今天的分享就到這里啦,EBYTE每一天都致力于更好的助力物聯(lián)化、智能化、自動化的發(fā)展,提升資源利用率,更多產(chǎn)品更多資料,感興趣的小伙伴可以登錄我們的億佰特官網(wǎng)進行了解,也可以直接撥打400電話咨詢技術(shù)專員!
相關閱讀:
2、單片機系統(tǒng)針對網(wǎng)絡加密通訊的優(yōu)化方法