基本概念
SSL協(xié)議
SSL(Secure Sockets Layer,安全套接字協(xié)議)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。SSL協(xié)議即用到了對稱加密也用到了非對稱加密(公鑰加密),在建立傳輸鏈路時,SSL首先對對稱加密的密鑰使用公鑰進行非對稱加密,鏈路建立好之后,SSL對傳輸內(nèi)容使用對稱加密。
- 對稱加密 :速度高,可加密內(nèi)容較大,用來加密會話過程中的消息
- 公鑰加密 :加密速度較慢,但能提供更好的身份認(rèn)證技術(shù),用來加密對稱加密的密鑰
CA證書
我們知道HTTPS使用RSA加密算法來保證秘鑰傳遞的安全性,我們?nèi)绻WCServer下發(fā)的公鑰就是真正的Servier給我們的呢,為例解決這個問題,HTTPS使用CA證書解決這個問題,CA證書包含簽名信息和公鑰,CA證書由權(quán)威機構(gòu)使用自己的私鑰對公鑰等信息進行簽名。客戶端使用對應(yīng)內(nèi)置的root證書的公鑰對服務(wù)端下發(fā)的證書簽名解密進行驗證,如果驗證失敗則認(rèn)為當(dāng)前的證書是非法的。
證書鏈
為了防止CA機構(gòu)的私鑰泄露導(dǎo)致大規(guī)模的CA證書不再安全,CA機構(gòu)不會使用root證書私鑰對服務(wù)器公鑰進行簽名,而是使用二級證書私鑰對服務(wù)器公鑰進行簽名,這樣如果中間 CA 的私鑰泄漏了,那用根 CA 再簽發(fā)一個就好了,不會影響到這個根 CA 的所有證書。
單向認(rèn)證
SSL 單向認(rèn)證只需要驗證服務(wù)端的身份,無需驗證客戶端的身份。SSL 單向認(rèn)證的流程如下圖所示。
- 客戶端發(fā)起 HTTPS 建立連接請求,將客戶端支持的 SSL 協(xié)議版本號、加密算法種類、生成的隨機數(shù)等信息發(fā)送給服務(wù)端。
- 服務(wù)端向客戶端返回 SSL 協(xié)議版本號、加密算法種類、生成的隨機數(shù)等信息,以及服務(wù)端的證書(server.crt)。
- 客戶端驗證證書(server.crt)是否合法,并從此證書中獲取服務(wù)端的公鑰:檢查證書是否過期、檢查證書是否已經(jīng)被吊銷、檢查證書是否可信、檢查收到的證書中的域名與請求的域名是否一致。
- 證書驗證通過后,客戶端生成一個隨機數(shù)(密鑰 K),作為通信過程中對稱加密的密鑰,并用服務(wù)端證書的公鑰進行加密,然后發(fā)送給服務(wù)端。
- 服務(wù)端收到客戶端發(fā)送的加密信息后,使用私鑰(server.key)進行解密,獲取對稱加密密鑰(密鑰 K)。
在接下來的會話中,客戶端和服務(wù)端將會使用該對稱加密密鑰(密鑰 K)進行通信,保證通信過程中信息的安全。
雙向認(rèn)證
SSL 雙向認(rèn)證需要驗證客戶端和服務(wù)端的身份。SSL 雙向認(rèn)證的流程如下圖所示。
- 客戶端發(fā)起 HTTPS 建立連接請求,將客戶端支持的 SSL 協(xié)議版本號、加密算法種類、生成的隨機數(shù)等信息發(fā)送給服務(wù)端。
- 服務(wù)端向客戶端返回 SSL 協(xié)議版本號、加密算法種類、生成的隨機數(shù)等信息,以及服務(wù)端的證書(server.crt)。
- 客戶端驗證證書(server.crt)是否合法,并從此證書中獲取服務(wù)端的公鑰:檢查證書是否過期、檢查證書是否已經(jīng)被吊銷、檢查證書是否可信、檢查收到的證書中的域名與請求的域名是否一致。
- 服務(wù)端要求客戶端發(fā)送客戶端的證書(client.crt),客戶端將自己的證書發(fā)送至服務(wù)端。
- 服務(wù)端驗證客戶端的證書(client.crt),驗證通過后,服務(wù)端使用根證書(root.crt)解密客戶端證書,然后獲取客戶端的公鑰。
- 客戶端向服務(wù)端發(fā)送自己所支持的對稱加密方案。
- 服務(wù)端從客戶端發(fā)送過來的對稱加密方案中,選擇加密程度最高的加密方式,并使用客戶端公鑰加密后,返回給客戶端。
- 客戶端使用客戶端的私鑰(client.key)解密加密方案,并生成一個隨機數(shù)(密鑰 K),作為通信過程中對稱加密的密鑰,然后使用服務(wù)端證書的公鑰進行加密后再發(fā)送給服務(wù)端。
- 服務(wù)端收到客戶端發(fā)送的加密信息后,使用服務(wù)端的私鑰(server.key)進行解密,獲取對稱加密密鑰(密鑰 K)。
在接下來的會話中,客戶端和服務(wù)端將會使用該對稱加密密鑰(密鑰 K)進行通信,保證通信過程中信息的安全。
總結(jié)
SSL 單向認(rèn)證和雙向認(rèn)證的區(qū)別
- SSL 單向認(rèn)證 無需客戶端擁有證書,只需服務(wù)端擁有證書。SSL 雙向認(rèn)證 需要客戶端和服務(wù)端雙方都擁有證書。
- SSL 單向認(rèn)證相對于 SSL 雙向認(rèn)證的認(rèn)證過程,無需在服務(wù)端驗證客戶端證書、以及協(xié)商加密方案,服務(wù)端發(fā)送給客戶端也是未加密的密碼方案(并不影響 SSL 認(rèn)證過程的安全性)。
- 一般 Web 應(yīng)用的用戶數(shù)量眾多,無需在通訊層做用戶身份驗證,因此配置 SSL 單向認(rèn)證即可。但部分金融行業(yè)用戶的應(yīng)用對接,可能會要求對客戶端做身份驗證,此時就需要做 SSL 雙向認(rèn)證。