HTTPS詳解


前言

1990年互聯網誕生之初,就已經開始用超文本傳輸協議HTTP傳輸數據,這也是為什么現在網頁地址都是以http開頭的原因。但是HTTP協議傳輸數據是明文傳輸,任意的人抓包就能看到傳輸的數據,這顯然不安全。1994年,Netscape公司用加密協議增加了HTTP,開始在HTTP的基礎上加入SSL(Secure Socket Layer)。稱為"HTTP over SSL"或者"HTTP Secure",也就是我們現在熟知的HTTPS。

SSL/TLS

SSL/TLS是位於TCP/IP 7層協議中的會話層,用於認證用戶和服務器,加解密數據以及維護數據的完整性,確保數據在傳輸過程中不會被修改。

TLS(Transport Layer Security,傳輸層安全協議)是IETF制定的一種新的協議,TLS1.0是建立在SSL3.0協議規范之上,是SSL3.0協議的后續版本,可以理解為SSL3.1。TLS的主要目的是使SSL更加安全,更加完善。TLS記錄格式於SSL記錄格式相同,但是版本號值不一樣,TLS的版本1.0使用的版本號是SSLv3.1。

SSL/TLS分為對稱加密和非對稱加密兩種方式。

對稱加密 

對稱加密是指加密和解密都用同一份密鑰。如下圖所示:

常用的對稱加密算法有AES-128,AES-192,AES-256。

非對稱加密

非對稱加密對應於一對密鑰,稱為私鑰和公鑰,用私鑰加密后需要用公鑰解密,用公鑰加密后需要用私鑰解密。如下圖所示:

對稱加密的優點是運算速度快,缺點是互聯網環境下無法將密鑰安全的傳送給對方。非對稱加密的優點是可以安全的將公鑰傳遞給對方,但是運算速度慢。

那么HTTPS究竟是采用對稱加密還是非對稱加密呢?答案是兩者都有。先采用非對稱加密傳輸協商對稱加密的密鑰,然后用對稱加密通信。

HTTPS加密過程

上圖是比較粗粒度的講解了HTTPS的非對稱和對稱加解密過程:

  1. 客戶端瀏覽器發起連接。
  2. WEB服務器將公鑰發給客戶端。
  3. 客戶端生成一個session key,並且將session key用公鑰加密后發送給服務器。
  4. 服務器用私鑰將session key解密出來。
  5. 客戶端和服務器用session key做對稱加密通信。

整個流程可以這樣抽象,但是實際上session key的生成是需要多次協商的結果(文章后面會講到),我們暫且這樣簡單的理解。整個流程會有一個問題,第2步中WEB服務器發給客戶端的公鑰,萬一被中間人修改了呢,換句話說,客戶端怎么驗證公鑰的正確性呢?那就需要講到數字簽名。

數字簽名

如上圖所示,公鑰內容的后面是會跟上一個數字簽名,該數字簽名是將公鑰內容的HASH用私鑰加密后的密文。客戶端拿到公鑰后,會用相同的HASH算法重新算一遍,得到一個HASH值hash1。然后用公鑰解密數字簽名得到HASH值hash2,如果hash1等於hash2就證明這個公鑰是沒有被中間人修改的。即使中間人修改了公鑰的內容,他也沒有私鑰可以重新生成數字簽名,用戶拿到修改后的公鑰一算發現HASH不對就會報錯。

TLS握手過程

Client Hello. 客戶端通過發送Client Hello消息給服務器初始化Session連接。

Client Hello 消息包含以下字段:

  • SSL/TLS 版本號。version 2 表示的是SSL 2.0,version 3 表示的是SSL 3.0,version 3.1表示的是TLS 1.0。
  • 隨機數Random_C。一共32個字節。前面4個字節是當前時間戳,后面28個字節是一個隨機數。后面協商對稱加密的Session Key會用到。
  • Session ID。如果是之前已經存在的連接重連,那么Session ID會是一串數字,否則是None。
  • Cipher Suite。支持的加密組件列表。例如TLS_RSA_WITH_DES_CBC_SHA, TLS 是TLS協議版本,TLS表示TLS1.0,RSA是密鑰交換算法,DES_CBC是加密算法,SHA是摘要算法。
  • 壓縮算法。表示建議選用的是哪種壓縮算法。

Client Hello 消息示例:

ClientVersion 3,1
ClientRandom[32]
SessionID: None (new session)
Suggested Cipher Suites:
   TLS_RSA_WITH_3DES_EDE_CBC_SHA
   TLS_RSA_WITH_DES_CBC_SHA
Suggested Compression Algorithm: NONE

Server Hello. 服務器收到客戶端的Client Hello 消息會響應一個Server Hello 消息,包括以下字段:

  • SSL/TLS 版本,客戶端和服務器都支持的SSL/TLS最高版本。
  • 隨機數Random_S,一共32個字節,前面4個字節是當前時間戳,后面28個字節是一個隨機數。后面協商對稱加密的Session Key會用到。
  • Session ID,這里會有三種情況。1.產生一個新的Session ID,表示沒有找到之前的Session ID或者之前沒有這個Session ID。2. 返回客戶端帶上的之前的Session ID。(斷鏈重連)3.Null,服務器沒有辦法產生新的Session ID。
  • Cipher Suite,服務器從剛才Client Hello消息的Cipher Suite加密列表中選中的加密組件。
  • 壓縮算法,表示選中的是哪種壓縮算法。

Server Hello 消息示例:

Version 3,1
ServerRandom[32]
SessionID: bd608869f0c629767ea7e3ebf7a63bdcffb0ef58b1b941e6b0c044acb6820a77
Use Cipher Suite:
TLS_RSA_WITH_3DES_EDE_CBC_SHA
Compression Algorithm: NONE

服務器發完Sever Hello 后還會發送下面幾條消息:

Server Certificate.服務器發給客戶端的證書,包含公鑰。客戶端后面會用該密鑰加密premaster secret。客戶端也會校驗證書的合法性,比如證書包含的域名是否就是客戶端正在訪問的域名。

Server Key Exchange.[可選]當服務器的證書不包含公鑰時,客戶端會用它來加密后面的Client Key Exchange消息。

Client Certificate Request.[可選]用於服務器需要驗證客戶端身份的情況,例如銀行系統通常用U盾來證明客戶端的身份。

Server Hello Done.表示Server已經發送消息完畢並且在登陸客戶端回復。

客戶端緊接着響應給服務器的消息:

Client Certificate.[可選]客戶端證書,包括客戶端的公鑰。響應上面的Client Certificate Request。

Client Key Exchange.該消息包括premaster secret,TLS的版本號,再次帶上版本號是因為之前的版本號是明文傳輸的,攻擊者可能會惡意修改為較低的版本號,從而降低連接的安全系數方便發起攻擊。該消息字段會用公鑰加密。現在一共有Random_C,Random_S, premaster secret三個隨機數,客戶端和服務器端會用相同的算法,用這三個隨機數作為參數,從而計算得到另外的一個隨機數,即后面對稱加密的密鑰Session Key。

Certificate Verify.[可選]該消息只針對有Client Certificate的情況。會計算出該消息字段的HASH,然后用客戶端的私鑰加密該HASH作為簽名。服務器端會使用Client Certificate消息中得到的客戶端公鑰解密並驗證這條消息的合法性。

Change Cipher Suite.該消息通知服務器接下來的Client Finish消息將會用剛才協商的密鑰Session Key來加密。

Client Finished.該消息會列舉客戶端上面用到的所有加密字段,並且算出他們的HASH值,然后用Session Key加密。

服務器在握手階段最后回應給客戶端的消息:

Change Cipher Suite Message.該消息通知客戶端接下來的消息會用Session Key來加密。

Sever Finished Message. 對整個協商階段用到的字段算一個HASH,然后用Session Key加密。

 

總結

文章首先介紹了HTTPS的由來,然后介紹了對稱加密和非對稱加密,以及HTTPS的加解密過程,最后詳細的講解了TLS的握手過程。

 

參考

https://tiptopsecurity.com/how-does-https-work-rsa-encryption-explained/

http://www.youdzone.com/signature.html

https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB

https://www.tutorialsteacher.com/https/how-ssl-works

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc785811(v=ws.10)

http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html

https://www.linuxidc.com/Linux/2016-05/131147.htm

https://hpbn.co/transport-layer-security-tls/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM