原文地址
我們知道,HTTP請求都是明文傳輸?shù)?,所謂的明文指的是沒有經(jīng)過加密的信息,如果HTTP請求被黑客攔截,并且里面含有銀行卡密碼等敏感數(shù)據(jù)的話,會非常危險。為了解決這個問題,Netscape 公司制定了HTTPS協(xié)議,HTTPS可以將數(shù)據(jù)加密傳輸,也就是傳輸?shù)氖敲芪?,即便黑客在傳輸過程中攔截到數(shù)據(jù)也無法破譯,這就保證了網(wǎng)絡(luò)通信的安全。
密碼學基礎(chǔ)
在正式講解HTTPS協(xié)議之前,我們首先要知道一些密碼學的知識。
明文: 明文指的是未被加密過的原始數(shù)據(jù)。
密文:明文被某種加密算法加密之后,會變成密文,從而確保原始數(shù)據(jù)的安全。密文也可以被解密,得到原始的明文。
密鑰:密鑰是一種參數(shù),它是在明文轉(zhuǎn)換為密文或?qū)⒚芪霓D(zhuǎn)換為明文的算法中輸入的參數(shù)。密鑰分為對稱密鑰與非對稱密鑰,分別應(yīng)用在對稱加密和非對稱加密上。
對稱加密:對稱加密又叫做私鑰加密,即信息的發(fā)送方和接收方使用同一個密鑰去加密和解密數(shù)據(jù)。對稱加密的特點是算法公開、加密和解密速度快,適合于對大數(shù)據(jù)量進行加密,常見的對稱加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密過程如下:明文 + 加密算法 + 私鑰 => 密文
解密過程如下: 密文 + 解密算法 + 私鑰 => 明文
對稱加密中用到的密鑰叫做私鑰,私鑰表示個人私有的密鑰,即該密鑰不能被泄露。
其加密過程中的私鑰與解密過程中用到的私鑰是同一個密鑰,這也是稱加密之所以稱之為“對稱”的原因。由于對稱加密的算法是公開的,所以一旦私鑰被泄露,那么密文就很容易被破解,所以對稱加密的缺點是密鑰安全管理困難。
非對稱加密:非對稱加密也叫做公鑰加密。非對稱加密與對稱加密相比,其安全性更好。對稱加密的通信雙方使用相同的密鑰,如果一方的密鑰遭泄露,那么整個通信就會被破解。而非對稱加密使用一對密鑰,即公鑰和私鑰,且二者成對出現(xiàn)。私鑰被自己保存,不能對外泄露。公鑰指的是公共的密鑰,任何人都可以獲得該密鑰。用公鑰或私鑰中的任何一個進行加密,用另一個進行解密。
被公鑰加密過的密文只能被私鑰解密,過程如下:
明文 + 加密算法 + 公鑰 => 密文, 密文 + 解密算法 + 私鑰 => 明文
被私鑰加密過的密文只能被公鑰解密,過程如下:
明文 + 加密算法 + 私鑰 => 密文, 密文 + 解密算法 + 公鑰 => 明文
由于加密和解密使用了兩個不同的密鑰,這就是非對稱加密“非對稱”的原因。
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量數(shù)據(jù)進行加密。
在非對稱加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(橢圓曲線加密算法)等。
HTTPS通信過程
HTTPS協(xié)議 = HTTP協(xié)議 + SSL/TLS協(xié)議,在HTTPS數(shù)據(jù)傳輸?shù)倪^程中,需要用SSL/TLS對數(shù)據(jù)進行加密和解密,需要用HTTP對加密后的數(shù)據(jù)進行傳輸,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。
SSL的全稱是Secure Sockets Layer,即安全套接層協(xié)議,是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。SSL協(xié)議在1994年被Netscape發(fā)明,后來各個瀏覽器均支持SSL,其最新的版本是3.0
TLS的全稱是Transport Layer Security,即安全傳輸層協(xié)議,最新版本的TLS(Transport Layer Security,傳輸層安全協(xié)議)是IETF(Internet Engineering Task Force,Internet工程任務(wù)組)制定的一種新的協(xié)議,它建立在SSL 3.0協(xié)議規(guī)范之上,是SSL 3.0的后續(xù)版本。在TLS與SSL3.0之間存在著顯著的差別,主要是它們所支持的加密算法不同,所以TLS與SSL3.0不能互操作。雖然TLS與SSL3.0在加密算法上不同,但是在我們理解HTTPS的過程中,我們可以把SSL和TLS看做是同一個協(xié)議。
HTTPS為了兼顧安全與效率,同時使用了對稱加密和非對稱加密。數(shù)據(jù)是被對稱加密傳輸?shù)?,對稱加密過程需要客戶端的一個密鑰,為了確保能把該密鑰安全傳輸?shù)椒?wù)器端,采用非對稱加密對該密鑰進行加密傳輸,總的來說,對數(shù)據(jù)進行對稱加密,對稱加密所要使用的密鑰通過非對稱加密傳輸。
以下圖片來自于limboy的博客

HTTPS在傳輸?shù)倪^程中會涉及到三個密鑰:
服務(wù)器端的公鑰和私鑰,用來進行非對稱加密
客戶端生成的隨機密鑰,用來進行對稱加密
一個HTTPS請求實際上包含了兩次HTTP傳輸,可以細分為8步。
1.客戶端向服務(wù)器發(fā)起HTTPS請求,連接到服務(wù)器的443端口
2.服務(wù)器端有一個密鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,服務(wù)器端保存著私鑰,不能將其泄露,公鑰可以發(fā)送給任何人。
3.服務(wù)器將自己的公鑰發(fā)送給客戶端。
4.客戶端收到服務(wù)器端的證書之后,會對證書進行檢查,驗證其合法性,如果發(fā)現(xiàn)發(fā)現(xiàn)證書有問題,那么HTTPS傳輸就無法繼續(xù)。嚴格的說,這里應(yīng)該是驗證服務(wù)器發(fā)送的數(shù)字證書的合法性,關(guān)于客戶端如何驗證數(shù)字證書的合法性,下文會進行說明。如果公鑰合格,那么客戶端會生成一個隨機值,這個隨機值就是用于進行對稱加密的密鑰,我們將該密鑰稱之為client key,即客戶端密鑰,這樣在概念上和服務(wù)器端的密鑰容易進行區(qū)分。然后用服務(wù)器的公鑰對客戶端密鑰進行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結(jié)束。
5.客戶端會發(fā)起HTTPS中的第二個HTTP請求,將加密之后的客戶端密鑰發(fā)送給服務(wù)器。
6.服務(wù)器接收到客戶端發(fā)來的密文之后,會用自己的私鑰對其進行非對稱解密,解密之后的明文就是客戶端密鑰,然后用客戶端密鑰對數(shù)據(jù)進行對稱加密,這樣數(shù)據(jù)就變成了密文。
7.然后服務(wù)器將加密后的密文發(fā)送給客戶端。
8.客戶端收到服務(wù)器發(fā)送來的密文,用客戶端密鑰對其進行對稱解密,得到服務(wù)器發(fā)送的數(shù)據(jù)。這樣HTTPS中的第二個HTTP請求結(jié)束,整個HTTPS傳輸完成。