關於網路安全加密的介紹可以看之前文章: "1. 網路安全——數據的加密與簽名,RSA介紹" "2. Base64編碼、MD5、SHA1 SHA512、HMAC(SHA1 SHA512)" "3. When I see you again(DES、AES、RSA、Base64、MD5加密原理介紹,代碼 ...
關於網路安全加密的介紹可以看之前文章:
1. 網路安全——數據的加密與簽名,RSA介紹
2. Base64編碼、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)
3. When I see you again(DES、AES、RSA、Base64、MD5加密原理介紹,代碼實現)
HTTPS建立過程相當複雜,下圖為示意圖,可以有整體認識,一般我們編程知道這些已足夠。
如果你想仿照HTTPS實現類似加密,可以閱讀下具體過程,作為參照
準備工作(對應圖中prepare1234)
可以看到,在客戶端向伺服器發起請求前,還有一些準備工作要做,或者說是有一些工作已經做好了。
- 從CA證書頒發機構,獲取數字證書。
- 伺服器:生成一對公私鑰S.pub,S.pri,私鑰自己保留,用於解密和簽名,不能外泄。將公鑰S.pub,身份信息,傳給CA(Certificate Authority)機構;
- CA機構:也有公私鑰C.pub,C.pri;由S.pub,身份信息另外附加CA簽名生成數字證書(簽名使用C.pri進行簽名)
- 將數字證書頒發給申請者(伺服器)
- 客戶端(比如我們經常使用的瀏覽器),為了安全性,會內置一份CA根證書,它包含C.pri,用於對數字證書驗證
發起鏈接
https使用的是443埠,而http使用的是80埠
TCP埠號是一個2位元組的整型,處於TCP報文段的前四個位元組(2位元組源埠號,2位元組目的埠號)。
很明顯範圍是0~65535。其中0~1023具有特殊意義,已經被綁定,比如上面說的443,80,還有ftp的21埠。從1024~49151也具有特殊含義,但是還沒有被用完,比如8080埠重定向。剩下的我們就可以隨便使用,自定義了。
其實之前在嵌入式開發中,沒有連接外網,也沒有使用瀏覽器等等這些。所以埠完全自定義隨便用,不用擔心衝突:)。
下麵的過程為具體詳細一點的過程,如果不想看,可以完全只看示意圖即可,對我們平時開發用處並不大。或者你在用wireshark類似的抓包工具時看的抓狂不認識,可以看看(反正我用Charles抓包):
1 客戶端發起請求(對應圖中1)
同樣需要三次握手,建立TCP連接(毫無疑問HTTPS也是基於TCP的)
2 客戶端發送Client Hello包(對應圖中2)
- 隨機數
裡面有1970年1月1日到現在的秒數,後面還有一個客戶端發來的隨機數Client.random
- Session ID
如果客戶端與伺服器費盡周折建立了一個HTTPS鏈接,剛建完就斷了,也太可惜,所以用Session ID將其保存,如果下次再來可以直接使用之前的鏈接進行對話(對稱密鑰)。
- 密文族
告訴伺服器,自己支持的加密演算法種類
- Server_name
3 Server Hello(對應圖中2)
- 隨機數:對應伺服器時間,伺服器sever.random
- Seesion ID,如果客戶端發給伺服器的session ID在服務端有緩存,服務端會嘗試使用這個session;否則伺服器會啟用新的並返回給客戶端;
- 伺服器挑選一個密文族
4 Certificate(對應圖中2)
伺服器終於發來我們想要的數字證書,包含了:簽發機構、過期時間、主題名稱、公共密鑰信息、指紋信息等等
5 Server Hello Done(對應圖中2)
伺服器發送結束
6 客戶端驗證(對應圖中3)
客戶端從內置的CA根證書獲取C.pub,對伺服器發送來的數字證書進行驗簽,如果一致,說明證書是CA頒發的(前提是C.pub是真實的,確實是CA機構的公鑰)。然後看看證書是否過期,功能變數名稱是否匹配
7 生成對稱密鑰(對應圖中4、5、6)
客戶端根據之前的:Client.random + sever.random + pre-master
生成對稱密鑰
經過S.pub加密發送給伺服器,之後即可通過對稱密鑰進行通訊。(就是之前我們熟悉的http)
最後
在整個過程中,一共涉及2對公私密鑰對,一對由伺服器產生,主要用於加密,一對由CA產生,主要用於簽名。
為什麼要多一個CA呢?
假設沒有CA,那麼如果伺服器返回的包含公鑰的包被hack截取,然後hack也生成一對公私鑰,他將自己的公鑰發給客戶端。hack得到客戶端數據後,解密,然後再通過伺服器的公鑰加密發給伺服器,這樣數據就被hack獲取。
有了CA後,客戶端根據內置的CA根證書,很容易識別出hack的公鑰不合法,或者說hack的證書不合法。