基礎知識準備:在了解https的基本原理之前,需要先了解如下的基本知識。
一、什麼是https,tls,ssl
https,也稱作http over tls。tls的前身是ssl,tls 1.0通常被標示為ssl 3.1,tls 1.1為ssl 3.2,tls 1.2為ssl 3.3。下圖描述了在tcp/ip協議棧中tls(各子協議)和http的關係。
二、http和https協議的區別
1、https協議需要到證書頒發機構(certificate authority,簡稱ca)申請證書,一般免費證書很少,需要交費。
2、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連線方式,使用的埠也不一樣,前者是80,後者是443。
4、http的連線很簡單,是無狀態的 。
5、https協議是由ssl+http協議構建的可進行加密傳輸、身份認證的網路協議, 要比http協議安全。
從上面可看出,https和http協議相比提供了
資料完整性:內容傳輸經過完整性校驗
資料私隱性:內容經過對稱加密,每個連線生成乙個唯一的加密金鑰
身份認證:第三方無法偽造服務端(客戶端)身份
其中,資料完整性和私隱性由tls record protocol保證,身份認證由tls handshaking protocols實現。
三、證書
1、什麼是證書呢?
2、證書中包含什麼資訊
3、為什麼服務端要傳送證書給客戶端
網際網路有太多的服務需要使用證書來驗證身份,以至於客戶端(作業系統或瀏覽器等)無法內建所有證書,需要通過服務端將證書傳送給客戶端。
4、客戶端為什麼要驗證接收到的證書
中間人攻擊
5、客戶端如何驗證接收到的證書
為了回答這個問題,需要引入數字簽名(digital signature)。
假設訊息傳遞在bob,susan和pat三人之間發生。susan將訊息連同數字簽名一起傳送給bob,bob接收到訊息後,可以這樣驗證接收到的訊息就是susan傳送的
當然,這個前提是bob知道susan的公鑰。更重要的是,和訊息本身一樣,公鑰不能在不安全的網路中直接傳送給bob。
此時就引入了證書頒發機構(certificate authority,簡稱ca),ca數量並不多, bob客戶端內建了所有受信任ca的證書。ca對susan的公鑰(和其他資訊)數字簽名後生成證書。
susan將證書傳送給bob後,bob通過ca證書的公鑰驗證證書簽名。
bob信任ca,ca信任susan, 使得 bob信任susan,信任鏈(chain of trust)就是這樣形成的。
事實上,bob客戶端內建的是ca的根證書(root certificate),https協議中伺服器會傳送證書鏈(certificate chain)給客戶端。
正式開始https的內容:
一、https的基本原理
從上面可知,https能夠加密資訊,以免敏感資訊被第三方獲取。所以很多銀行**或電子郵箱等等安全級別較高的服務都會採用https協議。https其實是有兩部分組成:http + ssl / tls,也就是在http上又加了一層處理加密資訊的模組。服務端和客戶端的資訊傳輸都會通過tls進行加密,所以傳輸的資料都是加密後的資料。具體是如何進行加密,解密,驗證的,且看下圖。
這個沒什麼好說的,就是使用者在瀏覽器裡輸入乙個https**,然後連線到server的443埠。
採用https協議的伺服器必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和乙個鎖頭,只是全世界只有你乙個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因為只有你乙個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。
這個證書其實就是公鑰,只是包含了很多資訊,如證書的頒發機構,過期時間等等。
這部分工作是由客戶端的tls來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出乙個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成乙個隨機值。然後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通訊就可以通過這個隨機值來進行加密解密了。
服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將資訊和私鑰(隨機值)通過某種演算法混合在一起,這樣除非知道私鑰(隨機值),不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰(隨機值),所以只要加密演算法夠彪悍,私鑰(隨機值)夠複雜,資料就夠安全。
這部分資訊是服務端用私鑰(隨機值)加密後的資訊,可以在客戶端被還原
客戶端用之前生成的私鑰(隨機值)解密服務端傳過來的資訊,於是獲取了解密後的內容。整個過程第三方即使監聽到了資料,也束手無策。
二、https的通訊流程和握手過程
1、https對應的通訊時序圖:
2、 https在傳輸資料之前需要客戶端(瀏覽器)與服務端(**)之間進行一次握手,在握手過程中將確立雙方加密傳輸資料的密碼資訊。tls/ssl協議不僅僅是一套加密傳輸的協議,更是一件經過藝術家精心設計的藝術品,tls/ssl中使用了非對稱加密,對稱加密以及hash演算法。握手過程的具體描述如下:
1. 瀏覽器將自己支援的一套加密規則傳送給**。
a) 驗證證書的合法性(頒發證書的機構是否合法,證書中包含的**位址是否與正在訪問的位址一致等),如果證書受信任,則瀏覽器欄裡面會顯示乙個小鎖頭,否則會給出證書不受信的提示。
b) 如果證書受信任,或者是使用者接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。
c) 使用約定好的hash演算法計算握手訊息,並使用生成的隨機數對訊息進行加密,最後將之前生成的所有資訊傳送給**。
a) 使用自己的私鑰將資訊解密取出密碼,使用密碼解密瀏覽器發來的握手訊息,並驗證hash是否與瀏覽器發來的一致。
b) 使用密碼加密一段握手訊息,傳送給瀏覽器。
5.瀏覽器解密並計算握手訊息的hash,如果與服務端發來的hash一致,此時握手過程結束,之後所有的通訊資料將由之前瀏覽器生成的隨機密碼並利用對稱加密演算法進行加密。
深入淺出HTTPS基本原理
基礎知識準備 在了解https的基本原理之前,需要先了解如下的基本知識。一 什麼是https,tls,ssl https,也稱作http over tls。tls的前身是ssl,tls 1.0通常被標示為ssl 3.1,tls 1.1為ssl 3.2,tls 1.2為ssl 3.3。下圖描述了在tc...
深入淺出HTTPS基本原理
一 什麼是https,tls,ssl https,也稱作http over tls。tls的前身是ssl,tls 1.0通常被標示為ssl 3.1,tls 1.1為ssl 3.2,tls 1.2為ssl 3.3。下圖描述了在tcp ip協議棧中tls 各子協議 和http的關係。二 http和htt...
HTTPS 深入淺出 SNI
sni server name indication 用來解決乙個伺服器擁有多個網域名稱的情況 之前的 ssl 握手資訊中並沒有攜帶客戶端要訪問的目標位址。這樣會導致乙個問題,如果一台伺服器有多個虛擬主機,且每個主機的網域名稱不一樣,使用了不一樣的證書,該返回哪乙個給客戶端?做法就是在 client...