使用RSA算法的SSL握手圖以下:html
Client端請求https鏈接,發送client_random和支持的加密方式算法
返回證書和server_random(通過Server端私鑰加密)windows
驗證證書,使用證書中公鑰加密permaster_secret(permaster_secret是一個隨機數)dom
Client端發送permaster_sercret至Server端,server端經過私鑰解密加密
Client端和Server端分別根據client_random、server_random和permaster_secret生成master secretspa
防止攻擊者攔截Client端請求,假裝成服務端。即防止出現以下狀況:操作系統
由於私鑰和公鑰誰都能生成,於是Client端沒法確認公鑰是否屬於Server端。數字證書則能夠解決這個問題。server
證書包含的主要內容:htm
證書信息:發佈機構、過時時間和序列號blog
全部者信息
全部者公鑰
數字證書由CA(certificate authority)頒發,其做用是保證數字證書裏的公鑰確實是這個證書的全部者。但數字證書一樣是能夠僞造的,如何保證這一點呢?這時就須要引入數字簽名。
客戶端驗證CA簽名過程以下:
這個過程的第二步,CA的公鑰從何而來呢?答案是從操做系統中來。CA的數量並很少,於是能夠內置在操做系統中。事實上操做系統中存儲的是CA的根證書,根證書中會有CA的公鑰,以https協議通訊時,Server端會發送證書鏈給Client端。即CA也分層級,下一級CA的真實性由上一級CA來保證(使用上一級CA的私鑰簽名)。而根CA的真實性由誰保證?答案顯然是操做系統。Windows發行版會內置世界上幾個大的根證書機構的證書,即便用正版windows,理論上就已經得到了可信的根證書。
此時Client端、Server端、CA之間的關係以下:
Client信任CA,CA信任Server(否則就不頒發證書了),使得Client信任Server,此時信任鏈造成。
最後還有一個問題,若是黑客只是想搗亂,把每次Client端發來的數據修改一遍再轉發給Server端,或是把Server端發來的數據修改一遍再回給Client端,該如何處理?解決的方法跟數字簽名很像,即對發送的信息內容作hash獲得hash值,而後將信息內容和hash值一塊兒加密發送。對端在解密後,對收到的信息內容以一樣的hash算法作hash計算,若是獲得的hash值相同,則數據未被修改。