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