HTTPS
HTTP協議采用明文傳輸信息,存在信息竊聽、信息篡改的風險,而TLS/SSL協議具有身份驗證、信息加密和完整性校驗的功能,可以保證數據得安全性。
HTTPS是在HTTP上建立SSL加密層,並對傳輸數據進行加密,是HTTP協議的安全版。HTTPS主要作用是:
- 對數據進行加密,並建立一個信息安全通道,來保證傳輸過程中的數據安全
- 對網站服務器進行真實身份認證,避免中間人偽造服務端身份。
SSL/TLS
TLS/SSL(安全傳輸層協議Transport Layer Security)是介於TCP和HTTP之間的一層安全協議。ssl基本工作方式是,服務器使用非對稱加密與客戶端進行通信,將公鑰發送給客戶端,客戶端生成對稱加密使用的密鑰, 然后對稱加密算法采用協商密鑰對信息以及信息摘要進行加密通信,不同的客戶端使用的對稱密鑰不同,從而可以保證每個客戶端和服務器之間通信信息只能有雙方獲取。
TLS/SSL的功能實現主要依賴於三類基本算法:散列函數 Hash、對稱加密和非對稱加密。
- 散列函數驗證信息的完整性
- 非對稱加密實現身份認證和密鑰協商
- 對稱加密算法采用協商的密鑰對數據加密

散列函數hash
常見的有 MD5、SHA1、SHA256,該類函數特點是函數單向不可逆、對輸入非常敏感、輸出長度固定,針對數據的任何修改都會改變散列函數的結果,用於防止信息篡改並驗證數據的完整性; 在信息傳輸過程中,散列函數不能單獨實現信息防篡改,因為明文傳輸,中間人可以修改信息之后重新計算信息摘要,因此需要對傳輸的信息以及信息摘要進行加密;
對稱加密
常見的有AES-CBC、DES、3DES、AES-GCM等,相同的密鑰可以用於信息的加密和解密,掌握密鑰才能獲取信息,能夠防止信息竊聽,通信方式是1對1; 對稱加密的優勢是信息傳輸1對1,需要共享相同的密碼,密碼的安全是保證信息安全的基礎,服務器和 N 個客戶端通信,需要維持 N 個密碼記錄,且缺少修改密碼的機制;
非對稱加密
即常見的 RSA 算法,還包括 ECC、DH 等算法,算法特點是,密鑰成對出現,一般稱為公鑰(公開)和私鑰(保密),公鑰加密的信息只能私鑰解開,私鑰加密的信息只能公鑰解開。因此掌握公鑰的不同客戶端之間不能互相解密信息,只能和掌握私鑰的服務器進行加密通信,服務器可以實現1對多的通信,客戶端也可以用來驗證掌握私鑰的服務器身份。 非對稱加密的特點是信息傳輸1對多,服務器只需要維持一個私鑰就能夠和多個客戶端進行加密通信,但服務器發出的信息能夠被所有的客戶端解密,且該算法的計算復雜,加密速度慢。
HTTPS通信過程
服務端申請CA證書
服務方向第三方機構CA提交公鑰、組織信息、個人信息(域名)等信息並申請認證,CA通過線上、線下等多種手段驗證申請者提供信息的真實性,如組織是否存在、企業是否合法,是否擁有域名的所有權等。
如信息審核通過,CA會向申請者簽發認證文件-證書。證書包含以下信息:申請者公鑰、申請者的組織信息和個人信息、簽發機構 CA的信息、有效時間、證書序列號等信息的明文,同時包含一個簽名,該簽名使用散列算法根據以上的明文計算出, 然后使用私鑰對該sign值加密,加密后,客戶端可以通過內置的CA機構公鑰驗證該sign值,而該sign值只能是CA機構的私鑰生成的,才能通過客戶端的驗證,由此該證書不可能被其他的中間人偽造或更改數據。
客戶端與服務端通信建立過程

1.客戶端向服務器發出請求時,服務器返回證書文件;
2.客戶端讀取證書中的相關的明文信息,采用相同的散列函數計算得到信息摘要,然后,利用內置根證書中的對應 CA的公鑰解密簽名數據,對比證書的信息摘要,如果一致,則可以確認證書的合法性,即公鑰合法;
3.客戶端驗證證書相關的域名信息、有效時間等信息;
4.客戶端生成一對對稱密鑰,並使用服務端生成的公鑰進行加密,發送到服務端。
5.雙方使用該對稱加密方式進行通信。
CA機構的作用
CA機構的作用就要從沒有CA機構證書風險說起。
服務器想與客戶端進行加密連接,必然需要協商加密密鑰信息,而無論是使用對稱加密或者是非對稱加密的方式,一旦有中間人攔截了數據包,就可以獲取密鑰信息。
- 如果直接是使用對稱加密,中間人獲取到密鑰,在每次傳輸數據時候,直接攔截一方的數據,使用密鑰解密,篡改,再加密發送而另外一端,接收方無從得知該數據是否被修改。
- 如果使用上面的使用非對稱加密的方式,即:服務端生成一對公私鑰,將公鑰發送給客戶端,然后由客戶端生成一對對稱密鑰發送給服務器的方式。此時中間人同樣可以攔截攔截服務器的公鑰,使用該公鑰生成一對對稱密鑰與服務端通信,這樣中間人與服務器的連接建立了,且無服務器不知情,隨后中間人生成一對自己的公私鑰,將公鑰發送給客戶端,由客戶端生成一對對稱密鑰,發送給中間人(客戶端以為公鑰是服務器的,生成密鑰后發送給服務器,而實際上被中間人攔截),中間人通過私鑰解密出客戶端的對稱密鑰,至此中間人與客戶端的連接建立,客戶端同樣不知情。客戶端和服務器進行通信時,雙發的數據都需要經過中間人轉發,而在轉發過程中可以隨意的對數據進行篡改,接收方同樣無法得知。
以上問題的出現是介於服務端和客戶端均無法知道與自己通信的對象是否是安全的,也就是無法對對方身份進行識別,哪怕有一方能夠識別出身份問題,就可以得知本次連接時不安全的。於是有了CA第三方權威機構。
CA機構的主要工作之一就是實現服務器端的身份的驗證,保證服務端在於客戶端建立加密連接的過程中不會被其他中間人在雙方不知情的情況下進行攔截后篡改信息。也就是說,即使中間人對攔截了服務器發送給客戶端的公鑰信息,並獲取CA機構公鑰解密得到了服務器的公鑰,同上面的方式一樣,中間人可以與服務器建立有效的連接。但是中間人卻無法通過客戶端的驗證,中間人沒有CA機構私鑰,無法生成可以被CA機構公鑰解密的證書信息,也就無法偽裝成客戶端的服務器。因此連接無法建立。
證書結構
明文信息:基本信息,包括公鑰、組織信息、個人信息(域名),簽發機構,有效時間,認證服務端域名等信息
簽名:使用散列算法計算出上面明文信息的簽名值sign,然后使用私鑰對該sign值加密,加密后,客戶端可以通過內置的CA機構公鑰驗證該sign值,而該sign值只能是CA機構的私鑰生成的,才能通過客戶端的驗證,由此該證書不可能被其他的中間人偽造或更改數據。

證書鏈
如果證書簽發機構為CA根證書機構,客戶端直接使用內置的根證書公鑰即可解密根證書,獲取並驗證證書信息正偽。
CA根證書簽發機構也可以指定一個中間機構作為證書的頒發機構,根機構提供給該中間機構一個中間證書來證實中間機構的合法性。獲取中間證書需要該中間機構需要生成一對公私鑰,然后提供自己機構信息,以及公鑰給CA根機構,得到該中間證書。之后中嘉案機構就可以使用自己私鑰為需要認證服務器頒發服務器證書,同時出示自己的中間證書給服務器。
客戶端獲取到服務器端提供的中間證書和服務器證書后,首先會驗證中間證書,因為中間證書由CA根證書機構的私鑰加密,而客戶端內置了對應的公鑰,所有可以驗證該中間證書是否是可信,並從該中間證書機構的公鑰,而服務器證書由中間機構使用私鑰進行加密,由此可以從中間證書中獲取的公鑰驗證服務器證書的合法性,並獲得服務器端生成的公鑰,有了該公鑰,就可以與服務器協商對稱加密算法。
根證書,中間證書與服務器證書在一起組合成一條合法的證書鏈,證書鏈的驗證是從根CA機構開始自下而上的信任傳遞的過程。

證書鏈有以下特點:
- 同一本服務器證書可能存在多條合法的證書鏈。服務器證書可以由被根機構信任的B機構或者是C機構頒發。由此可以得到server-B-root和server-C-root的證書鏈。
- 不同證書鏈的層級不一定相同。一般證書鏈在4層以內,這樣不會影響性能。
使用中間證書主要有以下的優點:
- 服務器證書可以由任意一個根機構認證的中間機構頒發,減少根證書機構的管理工作量,可以更高效的進行證書的審核與簽發。
- 根機構只需要使用自己的私鑰認證中間機構即可,然后使用中間機構的私鑰認證服務器。這樣根機構的私鑰使用更少,更加的安全,如果根機構私鑰泄露,吊銷過程十分困難,無法及時補救,而中間機構
- 則可以快速在線吊銷,並重新為用戶簽發新的證書
- 證書鏈四級以內一般不會對 HTTPS 的性能造成明顯影響。
參考文章:https://juejin.im/post/5af557a3f265da0b9265a498#heading-37
