ESP32 關於HTTPS的使用

1、背景

最近因爲公司項目的原因,接觸到關於HTTPS方面的東西,新東西有必要記錄一下。由於涉及公司的事,不公開。

對於公開的部分,會另外成文。

1.1 參考資料

注:網絡上資源很多,關鍵還是要靜下心來。

CA認證原理以及實現(上) https://www.cnblogs.com/mafeng/p/6651917.html

CA認證原理以及實現(下)https://www.cnblogs.com/mafeng/p/6651944.html

理解證書和證書鏈(三) https://blog.csdn.net/junwua/article/details/80506631

理解證書和證書鏈 https://blog.csdn.net/junwua/article/details/80506399

網站CA證書獲取 https://blog.csdn.net/xintonghanchuang/article/details/103299129

https://blog.csdn.net/liaofeifly/article/details/89230458

SSL雙向認證和SSL單向認證的區別 https://www.jianshu.com/p/fb5fe0165ef2

【講得非常易懂!!一定要看!!】祕鑰/證書/https握手/CA相關概念https://blog.csdn.net/m0_37681589/article/details/100038327?utm_source=blogxgwz7

mbed TLS 簡明教程(二)https://blog.csdn.net/z2066411585/article/details/79179906

基於mbedTLS實現的嵌入式固件知識產權保護方案 https://www.sohu.com/a/232831658_119709

mbedTLS與AWS雙向認證過程函數(里程碑式函數) https://blog.csdn.net/nicholas_duan/article/details/92799308

構建系統(CMake 版) https://docs.espressif.com/projects/esp-idf/zh_CN/v3.3/api-guides/build-system-cmake.html

詳解 HTTPS、TLS、SSL、HTTP區別和關係 https://blog.csdn.net/chan70707/article/details/82932153

openssl 生成自簽證書及查看證書細節 https://www.cnblogs.com/threegun/p/7130985.html

2、關於HTTPS、TLS、SSL

2.1 HTTPS 、tls/ssl 之間的關係

HTTPS,也稱作HTTP over TLS。TLS的前身是SSL,TLS 1.0通常被標示爲SSL 3.1,TLS 1.1爲SSL 3.2,TLS 1.2爲SSL 3.3。下圖描述了在TCP/IP協議棧中TLS(各子協議)和HTTP的關係。

TLS中包括了TLS Record Layer Protocol、TLS HandShake Protocol、TLS Change Spec Protocol 和TLS Alert Protocol。

相對HTTP,HTTPS有數據完整性、數據隱私性、身份驗證三個優點。

數據完整性和數據隱私性由TLS Record Protocol保證, 身份認證由TLS Handshaking Protocol實現。  

HTTP和HTTPS協議的區別在於

1、HTTPS協議需要到證書頒發機構(Certificate Authority,簡稱CA)申請證書,收費的。

2、HTTPS是具有安全性的SSL加密傳輸協議,HTTP是明文傳輸

3、端口不同HTTPS是443,而HTTP是80端口

4、HTTPS需要身份認證的

2.2 HTTPS是如何進行加密,解密,驗證的

步驟1、客戶端發起HTTPS請求----------即用戶在瀏覽器中輸入一個Https網址,然後連接到server的443端口

步驟2、服務端的配置--------採用HTTPS協議的服務器必須要有一套數字證書。這套證書就是一對公鑰和私鑰(視爲鑰匙、鎖頭的關係))。數字證書可以自己製作,也可以向證書組織申請。區別在於自己頒佈的證書需要客戶端驗證通過,纔可以繼續訪問(如將證書加入瀏覽器);向受信任的CA公司申請的證書無需驗證。

步驟3、傳送證書------服務器向客戶端傳送證書,實際上這個證書就是公鑰

步驟4、客戶端解析公鑰------由客戶端的TLS來完成。首先先驗證公鑰是否有效();若證書沒有問題,那麼生成一個隨機值,然後用證書(公鑰)加密。即隨機值被鎖頭給鎖起來了。

步驟5、傳送加密信息----傳送的是用證書加密後的隨機值,目的就是讓服務器端得到這個隨機值,以後客戶端和服務端的通信就可以通過這個隨機值來進行加解密了。

步驟6、服務端用私鑰解密信息-----得到客戶端傳過來的隨機值(作爲以後傳輸用的私鑰),要傳輸的信息就用這個隨機值進行對稱加密

步驟7、傳輸加密後的信息----服務端用私鑰(隨機值)加密後的信息,可以在客戶端被還原

步驟8、客戶端解密信息

HTTPSå å¯ï¼è§£å¯ï¼éªè¯

 HTTPS在傳輸數據之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸數據的密碼信息。TLS/SSL協議中使用了非對稱加密,對稱加密以及HASH算法。具體如下

1、瀏覽器將自己支持的一套加密規則發送給網站

2、網站從中選出一組加密算法與HASH算法,並將自己的身份信息以證書的形式發還給瀏覽器。證書中包含網址地址,加密公鑰以及證書的頒發機構等信息。

3、瀏覽器獲得網站幀數後

3.1 驗證證書的合法性

3.2 生成一串隨機數的密碼,並用證書中提供的公鑰加密

3.3 使用約定好的HASH算法計算握手消息,並使用生成的隨機數對消息加密,最後將之前生成的所有信息發送給網站。

4、網站接受到瀏覽器發出的數據後

4.1 使用自己的私鑰將信息解密取出密碼,使用密碼解密瀏覽器發來的握手信息,並驗證HASH是否與瀏覽器發來的一致。

4.2 使用密碼加密一段握手信息,發送給瀏覽器

5、瀏覽器解密並計算握手信息的HASH,如果與服務器發來的HASH一致,則握手結束。

之後所有的通信將由之前瀏覽器生成的隨機密碼並利用對稱加密算法進行加密。

在HTTPS安全協議中使用非對稱加密算法交換密鑰,使用對稱加密算法對數據進行加密/解密操作,提高加密/解密效率。

注HASH:

要獲得數字證書CA,我們需要使用數字證書管理工具:KeyTool和OpenSSL構建CSR(數字證書籤發申請),交由CA機構簽發,形成最終的數字證書。

 

3、關於mbedtls

 

 

4、在ESP32 中如何訪問指定URL(基於HTTPS)的資源

4.1 單向驗證

單向認證 SSL 協議不需要客戶擁有CA證書.一般Web應用都是採用SSL單向認證的,原因很簡單,用戶數目廣泛,且無需再通信層對用戶身份進行驗證。在應用邏輯層保證用戶的合法登入。

客戶利用服務器傳過來的信息驗證服務器的合法性,服務器的合法性包括:證書是否過期,發行服務器證書的CA是否可靠,發行者證書的公鑰能否正確解開服務器證書的"發行者的數字簽名",服務器證書上的域名是否和服務器的實際域名相匹配。如果合法性驗證沒有通過,通訊將斷開;如果合法性驗證通過,將繼續進行第四步。

4.1.1獲取證書

從上面獲取到PEM 證書鏈。 

4.2 雙向驗證

雙向認證 SSL 協議要求服務器和用戶雙方都有證書。應用比較多的在於企業應用對接上,要求客戶端做身份驗證。

客戶端的私鑰和證書生成過程:

4.2.1 利用openssl工具生成一個RSA客戶端私鑰

openssl genrsa -out client.key

注意:生成私鑰,需要提供一個至少4位,最多1023位的密碼。

4.2.2 生成客戶端CSR(證書籤名請求)

openssl req -out client.csr -key client.key -new

說明:需要一次輸入國家,地區,城市,組織,組織單位, Common Name和Email。其中Common Name,可以寫自己的名字或者域名。如果要支持https,Common Name應該與域名保持一致,否則會引起瀏覽器警告。

可以將CSR發給(提交給)證書頒發機構(CA),CA驗證過請求者的身份之後,會出具簽名證書,需要花錢。

4.2.3 可以生成x509格式的CA自簽名證書

openssl req -new -x509 -keyout ca.key -out ca.crt

4.2.4 用生成的CA證書和私鑰爲csr文件簽名

openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

4.2.4 生成p12格式證書

openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx

4.2.5 生成pem格式證書

有時需要用到pem格式的證書,可以用一下方法合併證書文件(crt)和私鑰文件(key)來生成

cat client.crt client.key> client.pem

服務端的亦然。

4.2.1 和4.2.2 兩步就是構建密鑰對的過程(公鑰和私鑰)

下圖說明了數字證書的簽發簡單過程。

如果認證機構是我們自己,就可以獲得CA自簽名證書。就如4.2.3 中生成X509格式的CA自簽名證書。

4.3 嵌入到程序中

在ESP32 中單向驗證中,要將服務器的證書預先嵌入到程序中,方便在HTTPS配置時指定。ESP32支持pem格式的證書。因此要生成服務器端的pem證書。

有時候在組件中要用到一個二進制文件或者一個文本文件。但是又不希望它重新格式化一個C源文件。此時在ESP-IDF的構建框架內可以選擇嵌入二進制數據的方式來嵌入。具體步驟如下鏈接所示。

https://docs.espressif.com/projects/esp-idf/zh_CN/v3.3/api-guides/build-system.html

在component.mk文件中設置變量COMPONENT_EMBED_FILES,將指定要嵌入的二進制文件嵌入

COMPONENT_EMBED_FILES := server_cert.der

如果文件是文本文件(字符串),則可以使用變量COMPONENT_EMBED_TXTFILES將文本文件的內容當成以null結尾的字符串嵌入。

COMPONENT_EMBED_TXTFILES := server_root_cert.pem

文件的內容會被編譯荊flash中的.rodata段,並通過符號名稱來訪問。

extern const uint8_t server_root_cert_pem_start[] asm("_binary_server_root_cert_pem_start");
extern const uint8_t server_root_cert_pem_end[]   asm("_binary_server_root_cert_pem_end");

 符號名稱是根據文件的全名生成的,其中的字符/,.,等都會被下劃線替代。符號名稱中以_binary前綴由objcopy添加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章