現在很多網站已經逐漸使用HTTPS來代替HTTP來保障通信安全。和HTTP相比,HTTPS不再采用明文傳輸數據,第三方無法竊聽通信的內容,也無法篡改內容或者偽造身份。
HTTPS采用SSL/TSL協議,TSL協議可以看做是SSL的升級版本,其實大部分情況下他們都指代一個東西。
建立一個可靠的HTTPS連接涉及到四次通信:
第一次:客戶端-->服務器:
主要提供以下信息:
- 支持的協議版本,比如TLS1.0
- 支持的加密方法,比如RSA公鑰加密
- 支持的壓縮方法
一個客戶端生成的隨機數,稍后用于生成“對話密鑰”
第二次:服務器-->客戶端
主要提供以下信息:
- 確認使用的協議版本,如果不符合就關閉通信
- 確認使用的加密方法
服務器證書(包含給客戶端使用的公鑰)
一個服務器生成的隨機數,稍后用于生成“對話密鑰”
第三次:客戶端-->服務器
一個客戶端生成的隨機數。該隨機數用服務器公鑰加密,防止被竊聽。
- 編碼改變通知,表示隨后的信息都將用
雙方商定的加密方法和密鑰發送
- 客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供服務器校驗。
第四次:服務器-->客戶端
- 編碼改變通知,表示隨后的信息都將用
雙方商定的加密方法和密鑰發送
- 服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供客戶端校驗。
至此,整個握手階段全部結束。接下來,客戶端與服務器進入加密通信,就完全是使用普通的HTTP協議,只不過用"對話密鑰"加密內容。
這里有需要注意的幾點:
- 服務器提供給客戶端的證書中包含公鑰。對于非對稱加密RSA來說,對于
公鑰加密的內容,只有私鑰才能解密
。 - 證書是分級的,稱為證書鏈。下一級證書的摘要由上一級證書的私鑰簽名。
簽名和加密不一樣,簽名是要用私鑰簽,用公鑰驗證的,剛好相反。
當需要驗證下一級的證書是否可靠的時候,我們用上一級證書提供的公鑰對簽名的摘要進行解密,然后把解密出來的摘要和我們自己計算出來的下一級證書摘要進行對比,如果完全一致,就說明下一級證書是可靠的,從而完成驗證。 - 當驗證到受信任的根證書時,就能夠確定要驗證的證書是可信任的了。根證書一般由數字證書認證機構CA頒發,在你的瀏覽器的可信任證書列表里面,瀏覽器根據這個列表來判斷根證書是否可信。
- 隨機數總共有三個,其中第三個是用公鑰加密的,其他兩個都是明文的。之所以使用三個隨機數,是為了確保生成的“對話秘鑰(Session Key)”不容易被破解