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