你最終相信的其實是windows自帶的一個「全球靠譜證書發布者名單」。在這些名單裡面的人發布的證書你也會跟著相信,這是一個信任鏈。之前我國的一個發布者就因為濫發證書,被windows一個補丁從列表裡拿掉了(所以得更新,不然要遭重)。
等你確定一個https網站是可信的之後,後面通信建立起來別人就不能偷聽了,除非是運行在你機器裏的木馬。中間人攻擊的話就會對不上證書得描述,這就是為什麼它要濫發證書,就是為了騙你,好中間人攻擊。
第一個問題,你已經回答了,客戶端用證書來驗證正在訪問的網站是否真實。這個其實很重要,你記得支付寶網站是http://www.alipay.com,要往裡面存錢,這證書可以保證當前訪問的真的是它。因為證書和域名綁定,並且由根證書機構簽名確認。那麼這個根證書機構是哪兒來的?chrome、firefox乃至微軟系統裡面都默認帶的。大家都被迫選擇信任這些根證書機構列表以及他們簽發的證書,支付寶的證書就是由這些根證書機構簽發的。所以,沒有無緣無故的信任(想說區塊鏈的滾粗),這就是證書的信任鏈——所以黑客想去攻擊這些根證書機構,如果得手了,可以簽發證書用來給釣魚網站、惡意病毒簽名,也可以去偷第三方公司獲得的證書。
第二個問題,你覺得密鑰交換過程可以被中間人攻擊,那就是拍腦袋的想法了,你攻擊一個給我看看?拿最簡單的RSA密鑰交換來說,過程如下:客戶端拿到了服務端證書並且基於CA驗證了真實性,取出服務端公鑰,然後生成一個足夠長的串作為會話密鑰用服務端的公鑰加密,傳給服務端。服務端解密得到會話祕鑰,然後雙方用這個通訊。
假設你嗅探了服務端發證書的過程,只能拿到公鑰,基於非對稱加密的基本原理,算不出來私鑰,拿到了公鑰卵用都沒有。假設你劫持了服務端發證書用自己的公鑰替換,證書有CA簽名的,客戶端一驗算簽名就知道證書被改了。假設你嗅探了客戶端發過去的加密後的會話祕鑰,一樣的基於非對稱演算法基本原理你解不出來。假設你劫持了客戶端發過去的數據,因為是加密的解不開,你想篡改最多隻能瞎JB篡改密文,那麼服務端的私鑰去解密發現解不開。
最簡單的RSA密鑰交換你都毫無辦法,那麼為啥不用這個?因為這種模式可能會被「回溯攻擊」所影響。簡單的說,哪一天有人通過物理攻擊(比如說把刀架在你脖子上)拿到了你的證書,而他又保存了以前所有的通訊過程(加密後的),現在就可以全部解密了。同時我們可以看到,安全研究人員對安全做到了多麼偏執的地步。於是,大神們搞出了ECDHE之類的密鑰交換演算法,不受「回溯攻擊」影響。可惜ECDHE又會受中間人攻擊影響,所以它需要RSA做簽名來配合。