HTTP (HyperText Transfer Protocol
,超文本傳輸協議) 是因特網上應用最爲普遍的一種網絡傳輸協議,全部的WWW
文件都必須遵照這個標準。算法
HTTP
協議是明文傳輸協議,通訊過程當中被中間人進行劫持、監聽、篡改,會形成我的隱私泄露等嚴重的安全問題segmentfault
在傳輸層和應用層加了
TSL/SSL
瀏覽器
Client
->Server
經過密鑰進行發送方加密、接收方解密安全
問題?如何安全傳輸密鑰,密鑰被中間人劫持,一切加密解密都是浪費時間服務器
也叫公開密鑰加密,有私鑰和公鑰網絡
Client
發送消息給Server
,Client
用Server
的公鑰進行加密,server用本身的私鑰進行解密,反之亦然。若是咱們使用非對稱加密傳輸數據,會有以下問題:session
客戶端如何獲取服務器的公鑰?dom
Server
發送本身的公鑰給Client
,中間人H
拿到Server
的公鑰,而後發送本身的公鑰給client
。Client
用H
的公鑰進行加密,發給Server
,中間人H劫持到消息,用本身的私鑰進行解密,而後用server
的公鑰進行加密,發送給Server
,Server
用本身的私鑰進行解密,獲得消息。Client
、Server
都以爲消息在正常傳輸,可是已經被中間人劫持了。CA
(Certificate Authority
證書頒發機構)Server
把本身的公鑰、域名等信息發送給CA
CA
拿到後用本身的私鑰進行加密Client
,中間人不是同樣能夠劫持嗎?。雞生蛋,蛋生雞的悖論了。Client
收到數字證書後,從數字證書中找到權威機構的信息,從本地找到權威機構的公鑰,就能正確解密Server
的公鑰。若是不校驗,中間人也能夠向權威機構申請數字證書,而後劫持
Server
發送的證書,而後發送本身的數字證書給Client
,Client
接受到後,用本地的公鑰解密,拿到中間人的公鑰。函數
Server
的公鑰,機構信息,還包括了證書內容的簽名、簽名計算方法、證書對應的域名簽名 等於
Server
的公鑰、其餘信息經過HASH
函數計算獲得證書的數字摘要,權威機構的私鑰加密獲得數字簽名網絡傳輸協議
Client
使用公鑰解密,獲得服務器的公鑰、證書的數字簽名、簽名計算方法。從新計算簽名,對比簽名是否一致。判斷證書是否被中間人篡改。Client
就沒法用CA
的本地公鑰進行解密。Server
發送證書給Client
,中間人直接替換成本身的證書,Client
用本地權威機構的公鑰解密,對比證書籤名也沒問題。可是Client
檢查證書中的域名和當前訪問的是否一致。不一致也會發出警告。HTTPS
通訊過程Client
發送Client Hello
報文給Server
開啓SSL
通訊,報文中包含Random_1
服務器支持SSL
通訊的話,發送Server Hello
報文迴應,報文中包含Random_2
服務器以後發送Certificate
報文,報文中包含數字證書
服務器再發送Server Hello Done
通知Client
,最初的SSL
握手階段協商部分結束
Client
對數字證書校驗,正確後,解密獲得服務器的公鑰。經過RSA
算法隨機生成Pre-Master Secret
,而且用服務器的公鑰進行加密,包含在Client Key Exchange
報文中,發送給Server
客戶端繼續發送Change Cipher Spec
報文,告知Server
端,客戶端切換協商的加密套件,準備使用協商的加密套件加密數據並傳輸。
Client
發送Finished
報文,該報文包含了鏈接至今所有報文的總體校驗值(也就是hash
值)
Server
接收到Client
的請求,用私鑰解密,把Pre-master secret
取出來。Server
發送一樣的Change Cipher Spec
報文
Server
一樣發送Finished
報文,提供Client
校驗
Server
和Client
的Finished
報文交換完畢,SLL
鏈接創建。開始通訊。
Client
和Server
都經過Random_1
、andom_2
、Pre-Master Secret
三個隨機數,經過僞隨機函數PRF
生成Master Secret
。再根據master secret
推導出hash secret
和sesson secret
hash secret
對HTTP
報文作一次運算生成一個MAC
,附在HTTP
報文的後面,而後用session-secret
加密全部數據(HTTP+MAC
),而後發送。session-secret
解密數據,而後獲得HTTP+MAC
,再用相同的算法計算出本身的MAC
,若是兩個MAC
相等,證實數據沒有被篡改。pre-master secret
自己就是一個隨機數,再加上Hello
和Server
消息中的隨機,三個隨機數經過一個密鑰導出器最終導出一個對稱密鑰Server
接收到重複的隨機數,能夠中斷通訊。