在一般情況下我們上網採用的超文字傳輸協議為http協議,https協議的全稱為Hypertext Transfer Protocol over Secure Socket Layer,相比http多了一個Secure,簡單來說就是http的安全版。
由於http是以明文方式傳送內容,不提供任何加密,因此當攻擊者截獲了web瀏覽器和網站伺服器之間的傳輸報文,就可以讀取其中的資訊,使用者就可能洩露自己的敏感資訊,如支付密碼,身份證號等等。那麼為了解決這個問題,網景公司最早提出了SSL協議,在http的基礎上加入了SSL協議,SSL依靠證書來為瀏覽器和伺服器之間的通訊加密。
那麼http與https的主要區別有哪些呢。
- https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
- http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
- http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
- http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
那麼https是如何工作的呢?
這裡只做簡單的說明,詳細內容可以參考http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html
在http握手之後,要進行SSL握手,分為以下四步
-
首先客戶使用https的url訪問伺服器,要求與伺服器建立安全連線。這時候就需要客戶端與伺服器協商我們接下來的加密應該怎麼做。客戶端先告訴伺服器,我的瀏覽器支援哪些加密方法,我的版本是什麼,等等。然後伺服器知道了之後,從客戶端支援的加密方法中隨機選擇一種,然後告訴客戶端。
-
這時候就會有一個問題,網站怎麼證明自己是一個清白的網站,這就需要一個公認的證書來證明自己的清白,就是certification,這個證書是由CA頒佈的,CA的證書上有它的簽名,如果使用者信任這個證書而遭到了損失,是可以通過這個證書追求法律責任的。這時候伺服器就把證書和公鑰傳送給了使用者。那公鑰又是什麼呢,這個是由於安全過程採用了金鑰交換演算法,這個交換演算法需要這一步驟。
-
客戶收到了證書與金鑰之後,第一步要向伺服器證明自己也是清白的(這一步可選),也傳送一個自己的證書資訊,第二步是瀏覽器生成會話金鑰並用公鑰加密,告訴伺服器。第三步是告訴伺服器我已經擁有你的證書和公鑰了(可選)。
-
最後兩方再一次交換金鑰,這個交換過程是為了防止金鑰被攻擊者修改。
經歷了SSL握手之後,客戶和伺服器就可以通過會話金鑰加密通訊。 同時在通訊過程中,SSL中還有一個警報協議來保護出現問題的情況,一旦出現錯誤立刻發出警報,如果是致命錯誤,會立即關閉SSL連線並刪除會話,金鑰等資訊。
那麼問題就出現了。為什麼這種安全的協議不在所有網站上使用起來呢。 因為https協議也有一些不好的地方, 1.首先它更耗時,畢竟多了握手的過程與加密的過程。 2.SSL證書需要錢,小網站一般不會用。 3.SSL證書需要繫結IP,不能再一個IP上繫結多個域名,IPV4資源不能支撐這個消耗 4.它的加密範圍有限,只能在某些方面安全,有些國家控制CA證書,中間人攻擊一樣可行。
提到它更耗時,那麼我們簡單的來看一下它到底多麼耗時。 在linux命令視窗輸入:
-w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n" -so /dev/null https://www.alipay.com
複製程式碼
上面命令中的w參數列示指定輸出格式,time_connect變數表示TCP握手的耗時,time_appconnect變數表示SSL握手的耗時,s引數和o引數用來關閉標準輸出。
我執行了多次,結果分別為:(單位是秒)
TCP handshake: 0.053, SSL handshake: 0.288
TCP handshake: 0.055, SSL handshake: 0.297
TCP handshake: 0.078, SSL handshake: 0.345
TCP handshake: 0.081, SSL handshake: 0.347
TCP handshake: 0.072, SSL handshake: 0.319
複製程式碼
可以看到,在建立連線階段,TCP+SSL握手的耗時就要遠高於TCP握手,大約為4-5倍 因此在安全度不高的情況下,能不用SSL就別用了。