由于http的傳輸服務是明文傳輸,所謂的明文傳輸就是在通信雙方的中間通過抓包發現http的頭部是明文,可以很容易獲取cookie,url中的信息,不要小看這些http頭部信息,曾經很多帳號的賬戶名和密碼都存在這兩個位置,當然隨著哈希,編碼等技術的應用,現在想要獲取密碼并不容易了。同時http的數據部分也是明文,可以很容易還原出數據內容,例如文字,圖片和視頻。
因此就出現了https服務,將明文傳輸的內容進行加密,包括http頭部和數據部分,由于加密之后的數據是一堆雜亂無章的二進制,因此,就無法獲取有意義的信息。
確切的說https并不是一種協議,而是TLS+HTTP兩種協議組合的服務。因此http還是以前的http,只是在http和TCP(當然也有DTLS,不多說)層之間加入了ssl協議,這樣tcp上層的數據部分就可以加密傳輸。
關于加密發展的歷史,我在這篇文章中有一定的闡述。
其實ssl可以設計的很簡單,因為該層主要作用就是協商通信雙方加密密鑰,然后對上層數據進行加解密。ssl之所以設計如此復雜的原因,還是在于數字證書的存在。首先加密有兩種方式,對稱加密和非對稱加密,其中對稱加密的速度要快于非對稱加密,因此在實際的應用中數據量大的加密都是對稱加密。
但是對稱加密無法保證密鑰的安全,因此需要非對稱加密來傳輸對稱加密所使用的密鑰,而非對稱加密由于需要驗證通信對等方的身份,因此需要數字證書。當然數字證書的作用就是攜帶簽驗證通信對等方的身份名,在openssl(openssl是ssl協議那一堆RFC的實現)中,證書還有另一個作用就是攜帶非對稱加密公鑰以及非對稱算法等。
在非對稱加密中有兩個概念需要注意的,就是簽名和加密。舉例來說,RSA是一種非對稱加密算法,該算法即可以用于加密,也可以用于簽名。所謂RSA加密就是使用公鑰進行加密,私鑰進行解密,應用就是ssl協議中的預主密鑰交換部分;所謂的RSA簽名就是使用私鑰進行簽名(其實也是加密,只是換一種說法),使用公鑰驗證簽名,對應ssl握手中的證書簽名和驗簽部分。
證書的驗證過程就是,網站證書certA部分的簽名由簽發該證書CA驗證,主要是該CA的公鑰進行驗簽,因為certA的簽名部分是由CA的私鑰進行簽名的;當然為了證明CA的身份,CA也需要一個證書,就是CA的證書certB,certB是由更高一級的CA簽發的,直至根CA。當然根CA也有一個證書就是根證書certC,通常該證書是集成在firefox這種瀏覽器廠商里面的,或者像android這種操作系統里面。
因此整個過程就是certA使用certB的公鑰驗證certA的合法性,certB使用certC的公鑰驗證certB的合法性,整個證書鏈必須全部驗證通過,證書的驗證才能通過。可以看到整個驗證最關鍵的地方在于根證書。如果系統中手動安裝了虛假的根證書,整個證書鏈的驗證就會出現問題。因此,像前面提到的那樣,根證書的集成是很關鍵的,是多家廠商和瀏覽器以及操作系統公司協商,資質認定的結果。像前一段時間沃通被吊銷根證書就是這些國外的瀏覽器巨頭和操作系統巨頭認定沃同不具備根證書的資格,說白了就是信用有問題,然后從瀏覽器以及操作系統中被刪除。那么由沃通授權的CA所簽發的證書就會受到影響。具體就是瀏覽器會彈出告警信息。因此可以看出即使是根證書機構,也是要約束自己的行為,不能隨意簽發證書。
當然實際上證書的驗證還包括證書里面的使用者信息或者擴展中的altname要和實際訪問的域名保持一致,日期不能失效等等,crl以及oscp列表等。因此這就導致了我們在申請證書的時候,是需要填寫證書的域名信息,也就是申請的證書是應用于哪個網站的。證書的時間信息一般是由簽發的CA決定的,可能是一年的有效期或者更長。當然,由于某種原因,例如網站私鑰泄漏了,需要重新申請證書,該證書就被廢棄掉,添加到crl列表。
以上就是HTTPS,SSL,數字證書,數字簽名之間的一些關系。