軟件測試 |HTTPS的通信加解密過程,證書為什么更安全?
對稱加密和非對稱加密
對稱加密:加密和解密用的是同樣的密鑰。
非對稱加密:加密和解密使用不同的密鑰。使用一對密鑰,公鑰(public key)是每個人都能拿到公開的,私鑰(private key)只有自己知道。


數(shù)字證書
數(shù)字證書是一種網(wǎng)絡(luò)上證明持有者身份的文件,同時還包含有公鑰。數(shù)字證書在 SSL/TLS 傳輸過程中扮演身份認(rèn)證和密鑰分發(fā)的功能。
服務(wù)端將公鑰發(fā)給數(shù)字證書認(rèn)證機構(gòu)進行安全認(rèn)證并對公鑰進行數(shù)字簽名,完成后公鑰和簽名組合成數(shù)字證書。在和客戶端通信時,服務(wù)端將數(shù)字證書發(fā)給客戶端,客戶端通過第三方安全認(rèn)證機構(gòu)發(fā)布的公鑰(一般會在瀏覽器開發(fā)時,內(nèi)置在瀏覽器中)對數(shù)字證書上的簽名進行驗證,假如驗證通過,則能證明該服務(wù)器的公鑰的機構(gòu)是真實有效的數(shù)字證書認(rèn)證機構(gòu),該服務(wù)器發(fā)過來的公鑰是值得信賴的。
數(shù)字證書包括了加密后服務(wù)器的公鑰、權(quán)威機構(gòu)的信息、服務(wù)器域名,還有經(jīng)過 CA 私鑰簽名之后的證書內(nèi)容(經(jīng)過先通過Hash函數(shù)計算得到證書數(shù)字摘要,然后用權(quán)威機構(gòu)私鑰加密數(shù)字摘要得到數(shù)字簽名),簽名計算方法以及證書對應(yīng)的域名。

HTTPS 協(xié)議的加解密過程
HTTPS 使用了混合加密的方式,也就是結(jié)合非對稱加密和對稱加密技術(shù)。
客戶端使用對稱加密生成密鑰對傳輸數(shù)據(jù)進行加密,然后使用非對稱加密的公鑰再對秘鑰進行加密,所以網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)是被秘鑰加密的密文和用公鑰加密后的秘密秘鑰,因此即使被黑客截取,由于沒有私鑰,無法獲取到加密明文的秘鑰,便無法獲取到明文數(shù)據(jù)。

ClientHello:首先客戶端發(fā)起 HTTPS 請求,然后連接到服務(wù)端的 443 端口??蛻舳藭?SSL/TLS 版本、客戶端的隨機數(shù)、加密組件(cipher suites)列表、支持的壓縮方法等等都一起傳給服務(wù)端。
ServerHello:服務(wù)端表示收到信息,并且會根據(jù) ClientHello 選擇好 SSL/TLS 版本和加密組件,并且把選擇好的版本組件以及服務(wù)端的隨機數(shù)發(fā)送給客戶端。
Certificate:接下來服務(wù)端會把包含公鑰的數(shù)字證書也發(fā)送給客戶端。采用 HTTPS 協(xié)議的服務(wù)器必須要有一套數(shù)字證書,可以自己制作,也可以向 CA 組織申請。區(qū)別就是自己頒發(fā)的證書需要客戶端驗證通過,才可以繼續(xù)訪問,而使用受信任的公司申請的證書則不會彈出提示頁面。數(shù)字證書包括了括了加密后服務(wù)器的公鑰、權(quán)威機構(gòu)的信息、服務(wù)器域名,還有經(jīng)過CA私鑰簽名之后的證書內(nèi)容,簽名計算方法以及證書對應(yīng)的域名等信息。
ServerHelloDone:通知客戶端,最初階段的握手協(xié)商完成了。
驗證數(shù)字證書:客戶端的 SSL/TLS 來完成數(shù)字證書驗證,首先會驗證公鑰是否有效,比如頒發(fā)機構(gòu),過期時間等等,如果發(fā)現(xiàn)異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那么就生成一個隨機值 pre_master。
ClientKeyExchange:通過客戶端隨機數(shù)、服務(wù)端隨機數(shù)和剛生成的 pre_master 生成會話密鑰,這個會話密鑰是對稱加密密鑰。只要安全發(fā)送給服務(wù)端,后面就可以使用這個會話密鑰加密信息、解密信息了。要安全的發(fā)送這個會話密鑰,需要使用服務(wù)端發(fā)送過來的公開密鑰把它加密一下。
ChangeCipherSpec:把加密過的會話密鑰發(fā)送給服務(wù)端
Finished:告訴服務(wù)后,后面發(fā)送的信息都會使用會話密鑰加密了。如果驗證失敗,這次握手就失敗了,關(guān)閉。
服務(wù)端驗證會話密鑰:服務(wù)端用私鑰解密后,得到了客戶端傳過來的會話密鑰。
ChangeCipherSpec:告訴客戶端,會話密鑰已經(jīng)收到,從現(xiàn)在起所有我發(fā)的信息都會使用會話密鑰盡心加密了!
Finished:我的信息發(fā)送完畢了。