HTTPS是什麼
HTTPS全稱為Hypertext Transfer Protocol over Secure Socket Layer,及以安全為目標的HTTP通道,簡單說就是HTTP的安全版本。
HTTPS其實是由兩部分組成的:HTTP+TLS/SSL,即HTTP下加入TLS/SSL層,HTTPS的安全基礎就是TLS/SSL。服務端和客戶端的資訊傳輸都會通過TLS/SSL進行加密,所以傳輸的資料都是加密之後的資料。TLS的前身就是SSL協議,因此沒有特別說明TLS/SSL說的都是同一個東西。
HTTP在安全方面的缺陷
HTTP本身是明文傳輸的,沒有經過任何安全處理。例如使用者在百度搜尋了一個關鍵字,比如"蘋果手機",中間者完全能夠查到到這個資訊,並且有可能打電話過來騷擾使用者。也有一些使用者投訴使用百度時,發現首頁或者結果頁浮了一個很長很大的廣告,這也肯定是中間者往頁面插的廣告內容。如果劫持技術比較低劣的話,使用者甚至無法訪問百度。
這裡提到的一些中間者主要指一些網路節點,使使用者資料在瀏覽器和百度伺服器之間傳輸必須要經過的節點,比如WIFI熱點、路由器、防火牆、反向代理、快取伺服器等。
在HTTP協議下,中間者可以隨意嗅探使用者搜尋內容,竊取隱私甚至篡改網頁。不過HTTPS是這些劫持行為的剋星,能夠完全有效地防禦。總體來說,HTTPS協議提供了三個強大的功能來對抗上述的劫持行為:
1、內容加密。瀏覽器到百度伺服器的內容都是以加密形式傳輸的,中間者無法直接檢視原始內容
2、身份認證。保證使用者訪問的是百度服務,即使被DNS劫持到了第三方站點,也會提醒使用者沒有訪問百度服務
3、資料完整。防止內容被第三方冒充或篡改
HTTPS工作原理
用一張圖表示一下HTTPS的工作原理,來自http://blog.csdn.net/sean_cd/article/details/6966130,這位網友將基本的HTTPS工作原理已經總結得挺好了,我在此文的基礎上再做一些補充:
其工作過程大致是:
1、客戶端發起HTTPS請求
瀏覽器裡面輸入一個HTTPS網址,然後連線到服務端的443埠上。注意這個過程中客戶端會傳送一個密文族給服務端,密文族是瀏覽器所支援的加密演算法的清單。
2、服務端配置
採用HTTPS協議的伺服器必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面。
這套證書其實就是一對公鑰和私鑰,可以這麼理解,公鑰就是一把鎖頭,私鑰就是這把鎖的鑰匙,鎖頭可以給別人對某個東西進行加鎖,但是加鎖完畢之後,只有持有這把鎖的鑰匙才可以解鎖看到加鎖的內容。
前面說過客戶端會傳送密文族給服務端,服務端則會從這些密文族中,挑選出一個,比如百度吧:
採用的就是RSA公鑰加密演算法來區分證書籤名和交換金鑰,通過AES演算法來加密資料,至於GCM,應該是用來校驗資訊的
3、傳送證書
這個證書其實就是公鑰,只是包含了很多資訊,如證書的頒發機構、過期時間等等。
4、客戶端解析證書
這部分工作是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,如頒發機構、過期時間等等,如果發現異常則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨機值,然後用證書對該隨機值進行加密。
注意一下上面提到的"發現異常"。證書中會包含數字簽名,該數字簽名是加密過的,是用頒發機構的私鑰對本證書的公鑰、名稱及其他資訊做hash雜湊加密而生成的。客戶端瀏覽器會首先找到該證書的根證書頒發機構,如果有,則用該根證書的公鑰解密伺服器下發的證書,如果不能正常解密,則就是"發現異常",說明該證書是偽造的。
5、傳送加密資訊
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,然後客戶端和服務端的通訊就可以通過這個隨機值來進行加密和解密了。
6、服務端解密資訊
服務端用私鑰解密後,得到了客戶端傳過來的隨機值,至此一個非對稱加密的過程結束,看到TLS利用非對稱加密實現了身份認證和金鑰協商。然後把內容通過該值進行對稱加密。
7、傳輸加密後的資訊
這部分是服務端用隨機值加密後的資訊,可以在客戶端被還原。
8、客戶端解密資訊
客戶端用之前生成的隨機值解密服務端傳送過來的資訊,於是獲取瞭解密後的內容,至此一個對稱加密的過程結束,看到對稱加密是用於對伺服器待傳送給客戶端的資料進行加密用的。整個過程即使第三方監聽了資料,也束手無策。
證書
下面對上述過程中的一些細節做解釋,首先是第二點中提到了證書,證書其實就是伺服器自己的一套身份資訊,客戶端拿到證書之後會首先驗證證書的合法性,如頒發證書的機構是否合法、證書中包含的網站地址是否與正在訪問的地址一致等,如果證書受信任,則瀏覽器欄裡面會顯示一個小鎖頭,否則則會給出證書不受信的提示。以百度為例,一個受信的證書應該在瀏覽器上是這樣的
關於證書,還是以百度、天貓為例,看一下它們的證書:
看到百度的證書使用的是VeriSign頒發的證書,頒發給baidu.com,並標明瞭有效期。VeriSign是一個提供智慧資訊基礎設施服務的上市公司,數字證書業務則是其起家的核心業務。再看天貓的證書:
天貓使用的證書則是GlobalSign頒發的,頒發給*.tmall.com。GlobalSign同樣是一家聲譽卓著、備受信賴的CA中心和SSL數字證書提供商。再看一下百度的證書的具體資訊:
從證書資訊中看到了加密演算法和具體的公鑰。
如何由HTTP變為HTTPS
我們在瀏覽器中輸入http://www.baidu.com/會自動跳轉至https://www.baidu.com/,看下是怎麼做到的,截三張圖就明白了:
看到302就很明顯了,response裡面的Location表示後一個要請求的頁面,因此百度使用的方法是對http://www.baidu.com/這個地址做了一次的重定向,這應該是最簡單、最容易想到的方法,實現也方便,做一個過濾器就好了。
不過用同樣的方法看一下天貓網站,似乎不是這樣做的:
並沒有發起重定向,我猜想可能是利用了負載均衡將請求http變為了https。