HTTP是明文傳輸的,也就意味着,介於發送端、接收端中間的任意節點均可以知道傳輸的內容是什麼。算法
所以HTTP具備以下的缺點:服務器
竊聽風險:被第三方通訊內容。session
篡改風險:第三方修改客戶端和服務券的通訊內容。dom
HTTPS實際上是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會經過TLS進行加密,因此傳輸的數據都是加密後的數據函數
客戶端與服務端之間創建TCP鏈接,使用的是443端口ui
client發送ClientHello,指定版本,隨機數(RN),全部支持的密碼套件(CipherSuites):加密
收到client hello後,服務器恢復ACK,沒有使用捎帶確認spa
server迴應ServerHello,指定版本,RN(服務器生成的隨機數,稍後用於生成"對話密鑰"),選擇CipherSuites,會話ID(Session ID)server
經過這一步,客戶端和服務器就完成了加密和簽名算法的交換。xml
server發送Certificate
而後,服務器給客戶端展現證書
ServerKey Exchange:用來發送密鑰交換算法相關參數和數據的。根據密鑰交換算法的不一樣,傳遞的參數也是不一樣的。
ServerHello Done:服務器要傳輸的信息結束
client拿到server的certificate後,就能夠開始利用certificate裏的public key進行session key的交換了。
ClientKey Exchange:客戶端對Server Key Exchange的迴應,用於交換密鑰須要的參數。和服務器同樣,不一樣的密鑰交換算法實現是不同的,所以須要的參數也是有差別的:包含pre-master secret。客戶端生成第三個隨機數。若是是採用RSA算法,會生成一個48字節隨機數,而後用server的公鑰加密以後再放入報文中;
change_cipher_spec 客戶端使用上面的3個隨機數client random, server random, pre-master secret, 計算出48字節的master secret, 這個就是對稱加密算法的密鑰。
Server-Client已經將服務器認證的相關工做作完了,密文函數&密鑰交換須要的參數也都相互傳遞了。
Encrypted Handshake Message:代表握手已經完成,而且對以前發過的數據進行加密發送給對方作校驗,防止被篡改。同時也驗證一下,加密算法、密鑰工做是否正常。
SSL/TLS握手過程能夠分紅兩種類型:
這個過程實際上產生三個隨機數:client random, server random, pre-master secret.前兩個隨機數都是明文傳送的,只有pre-master secret是加密的(RSA或者DH)。server使用RSA證書,RSA便可以用做簽名也能夠用做不對稱加密,pre-master secret就是用server的RSA證書中包含的公鑰加密的。
RSA算法在:
RAS計算過程:
選兩個超級大的素數:p 和 q
把他們乘起來:n = p * q
而後把p-1和q-1也乘起來:m = (p - 1) * (q - 1)
再找一個和m互質的數:e -> gcd(e, m) = 1
最後,找一個d,知足:(e * d) mod m = 1而後公鑰就是(n, e)的組合,私鑰就是(n, d)的組合
TLS要作的事情就是兩個:身份校驗 & 加密算法和密鑰協商。