HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer 超文本傳輸安全協議)
HTTPS在傳統的HTTP和TCP之間加了一層用於加密解密的SSL/TLS層
(安全套接層Secure Sockets Layer/安全傳輸層Transport Layer Security)層。使用HTTPS必須要有一套自己的數字證書(包含公鑰和私鑰)。
HTTPS解決的問題
- 信息加密傳輸:第三方無法竊聽;
- 校驗機制:一旦被篡改,通信雙方會立刻發現;
- 身份證書:防止身份被冒充。
HTTPS加密過程:
- 客戶端請求服務器獲取
證書公鑰
- 客戶端(SSL/TLS)解析證書(無效會彈出警告)
- 生成隨機值
- 用
公鑰加密
隨機值生成密鑰 - 客戶端將
祕鑰
發送給服務器 - 服務端用
私鑰
解密祕鑰
得到隨機值 -
將信息和隨機值混合在一起
進行對稱加密 - 將加密的內容發送給客戶端
- 客戶端用
祕鑰
解密信息
加密過程使用了對稱加密和非對稱加密。
-
對稱加密: 客戶端和服務端採用相同的密鑰經行加密
encrypt(明文,祕鑰) = 密文 decrypt(密文,祕鑰) = 明文
-
非對稱加密:客戶端通過公鑰加密。服務端通過私鑰解密
encrypt(明文,公鑰) = 密文 decrypt(密文,私鑰) = 明文
因爲TLS握手的過程中採用了非對稱加密,客戶端本身不知道服務器的祕鑰,這樣通信就不會被中間人劫持。此外這一步服務端還提供了證書,並且可能要求客戶端提供證書。關於證書下文會提到,只要有了證書,就能保證和你通信的對方是真實的,而不是別人僞造的。
那然後驗證證書呢?
- 客戶端獲取到了站點證書,拿到了站點的公鑰
- 客戶端找到其站點證書頒發者的信息
-
站點證書的頒發者
驗證服務端站點
是否可信 - 往上回溯,找到
根證書頒發者
- 通過
根證書頒發者
一步步驗證站點證書頒佈者
是否可信
附:
- HTTPS默認使用443端口,而HTTP默認使用80端口。
- TLS就是從SSL發展而來的,只是SSL發展到3.0版本後改成了TLS
- 第一次請求中TLS握手的代價很大
- 後續的請求會共用第一次請求的協商結果
我的GitHub地址
參考: