正文
大家都知道 HTTPS 比 HTTP 安全,也聽說過與 HTTPS 協議相關的概念有 SSL 、非對稱加密、 CA 證書等。
但對於以下靈魂三拷問可能就答不上了:
爲什麼用了 HTTPS 就是安全的?
HTTPS 的底層原理如何實現?
用了 HTTPS 就一定安全嗎?
HTTPS 的實現原理
HTTPS 的整體過程分爲證書驗證和數據傳輸階段,具體的交互過程如下:
瀏覽器發起 HTTPS 請求。
服務端返回 HTTPS 證書。
客戶端驗證證書是否合法,如果不合法則提示告警。
當證書驗證合法後,在本地生成隨機數。
通過公鑰加密隨機數,並把加密後的隨機數傳輸到服務端。
服務端通過私鑰對隨機數進行解密。
服務端通過客戶端傳入的隨機數構造對稱加密算法,對返回結果內容進行加密後傳輸。
爲什麼數據傳輸是用對稱加密?
爲什麼需要 CA 認證機構頒發證書?
“中間人攻擊”的具體過程如下:
本地請求被劫持(如 DNS 劫持等),所有請求均發送到中間人的服務器。
中間人服務器返回中間人自己的證書。
客戶端創建隨機數,通過中間人證書的公鑰對隨機數加密後傳送給中間人,然後憑隨機數構造對稱加密對傳輸內容進行加密傳輸。
中間人因爲擁有客戶端的隨機數,可以通過對稱加密算法進行內容解密。
中間人以客戶端的請求內容再向正規網站發起請求。
因爲中間人與服務器的通信過程是合法的,正規網站通過建立的安全通道返回加密後的數據。
中間人憑藉與正規網站建立的對稱加密算法對內容進行解密。
中間人通過與客戶端建立的對稱加密算法對正規內容返回的數據進行加密傳輸。
客戶端通過與中間人建立的對稱加密算法對返回結果數據進行解密。
瀏覽器是如何確保 CA 證書的合法性?
①證書包含什麼信息?
頒發機構信息
公鑰
公司信息
域名
有效期
指紋
......
②證書的合法性依據是什麼?
③瀏覽器如何驗證證書的合法性?
驗證域名、有效期等信息是否正確。證書上都有包含這些信息,比較容易完成驗證。
判斷證書來源是否合法。每份簽發證書都可以根據驗證鏈查找到對應的根證書,操作系統、瀏覽器會在本地存儲權威機構的根證書,利用本地根證書可以對對應機構簽發證書完成來源驗證。
判斷證書是否被篡改。需要與 CA 服務器進行校驗。
判斷證書是否已吊銷。通過 CRL(Certificate Revocation List 證書註銷列表)和 OCSP(Online Certificate Status Protocol 在線證書狀態協議)實現。
其中 OCSP 可用於第 3 步中以減少與 CA 服務器的交互,提高驗證效率。
這裏插一個我想了很久的但其實答案很簡單的問題:既然證書是公開的,如果要發起中間人攻擊,我在官網上下載一份證書作爲我的服務器證書,那客戶端肯定會認同這個證書是合法的,如何避免這種證書冒用的情況?
其實這就是非加密對稱中公私鑰的用處,雖然中間人可以得到證書,但私鑰是無法獲取的。
一份公鑰是不可能推算出其對應的私鑰,中間人即使拿到證書也無法僞裝成合法服務端,因爲無法對客戶端傳入的加密數據進行解密。
④只有認證機構可以生成證書嗎?
例如早期的 12306 採用的便是手動安裝私有證書的形式實現 HTTPS 訪問。
本地隨機數被竊取怎麼辦?
用了 HTTPS 會被抓包嗎?
總結
順手分享一張學習 HTTPS 的過程圖:
都看到這裏了,點贊留言分享一下嘛!!
掃碼關注最新動態
關鍵時刻,第一時間送達
- END -
本文分享自微信公衆號 - JAVA開發大本營(gh_42999193133a)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。