http傳輸如下:
此時信息是明文傳輸,如果信息被人截獲,則能看到里面的內容,極不安全
那就需要對內容加密,過程如下:
- 瀏覽器生成一個秘鑰
- 瀏覽器向服務器請求公鑰
- 服務器向瀏覽器發送它的公鑰
- 瀏覽器接收服務器發送的公鑰,并使用公鑰加密隨機生成的對稱密鑰,發送給服務器
- 服務器接收瀏覽器發送的數據,用自身私鑰,得到對稱加密密鑰
- 最后,瀏覽器和服務器可以使用對稱密鑰加密內容進行通信
但此方案仍會存在安全隱患,在第三步和第四步之間,如果被一個中間人獲取到它的公鑰,瀏覽器使用中間人的公鑰加密對稱密鑰,發送給服務器,中間人再次截獲數據,獲取其中的對稱密鑰。瀏覽器和服務器在雙方數據都不知情的情況下,數據內容被窺探。
問題的重點在于,第三步瀏覽器無法得到公鑰的來源的合法性,這就需要數字證書了。這就是https的解決方案
服務端單單發送公鑰,而是發送包含公鑰的數字證書。
數字證書由第三方機構頒發,瀏覽器已經維護了所有知名的第三方機構。
瀏覽器如何確定公鑰的合法性?
- 在接收數字證書時,查看證書的有效期
- 根據數字證書的第三方機構名稱,找到對應的公鑰,解密數字簽字,得到hash1
- 根據服務端網址等信息,使用簽名算法,生成hash2
- 如果hash1等于hash2,則公鑰合法
公鑰和私鑰的相關知識
公鑰和私鑰是一對密鑰對,它們可以互解密。使用公鑰加密,私鑰解密。能有效保證數據的安全性。但是如果使用私鑰加密,公鑰解密呢,則可以確定來源的合法性。因為只有知道私鑰才能加密,如果我們能使用公鑰解密得到正常內容(內容是否正確就是比較hash1和hash2),那么對方一定是擁有私鑰的主機,而私鑰是由第三方頒發給服務器的,這就是數字簽名。
OSI七層
物理層->數據鏈路層->網絡層->傳輸層->會話層->表示層->應用層
https的ssl位于傳輸層和應用層之間