您的連接不是私密連接 您的連接不是私密連接 qq瀏覽器
現如今的Web,HTTPS早已經成為標配,公開的HTTP網站已經和Flash一樣,慢慢在消亡了。
啟用HTTPS的核心是證書。不知道大家是否有留意,前幾年使用12306的時候,瀏覽器都會提示「您的鏈接不是私密鏈接」,這其實就是因為12306的證書有問題。如果點擊「繼續前往」,打開12306網站,它會提示你下載安裝它提供的“根證書”。
圖片來源于網絡
那么,證書是什么?里面含有什么內容?瀏覽器為什么會不信任12306的證書?為什么下載12306提供的根證書就可以解決這個問題?根證書又是什么?
證書:公鑰和私鑰
我們先來簡單回顧一下TLS 和HTTPS。HTTPS全稱是HTTP Over TLS,也就是使用TLS進行HTTP通信。
TLS (Transport Layer Security) 是一個安全通信協議,用于建立一個安全通道來交換數據。
看名字可以知道這是一個傳輸層協議,因此應用層協議對它是沒有感知的,HTTP, FTP, SMTP都可以和TLS配合使用。
TLS創建安全鏈接的步驟如下:
- 雙方協商使用的協議版本,加密算法等細節
- 服務器發送證書給客戶端
- 客戶端校驗證書有效性
- 雙方根據握手的一些參數生成一個對稱秘鑰,此后所有的內容使用這個秘鑰來加密
我們先來看證書,證書是一個文件,里面含有目標網站的各種信息。例如網站的域名,證書的有效時間,簽發機構等,其中最重要的是這兩個:
- 用于生成對稱秘鑰的公鑰
- 由上級證書簽發的簽名
關于RSA的公鑰和私鑰記住一點就行:我們可以使用算法生成一對鑰匙,他們滿足一個性質:公鑰加密的私鑰可以解開,私鑰加密的公鑰可以解開。
證書,顧名思義,是用來證明自己身份的。因為發送證書的時候是明文的(這一步也沒法加密),所以證書內容是可以被中間設備篡改的。
那么要怎樣設計一套機制保證當我們訪問github.com的時候,收到的證書確實是github.com的證書,而不是某個中間設備隨意發來的證書?
解決辦法是采用「信任鏈」。
首先,有一批證書頒發機構(Certificate Authority,簡稱為CA),由他們生成秘鑰對,其中私鑰保存好,公鑰以證書的格式安裝在我們的操作系統中,這就是根證書。
我們的手機、電腦、電視機的操作系統中都預裝了CA的根證書,他們是所有信任構建的基石。當然,我們也可以自己下載任意的根證書進行安裝。
接下來,只要設計一個體系,能夠證明A證書簽發了B證書即可。這樣對于收到的任何一個證書,順藤摸瓜,只要最上面的根證書在系統中存在,即可證明該證書有效。
比如說,我們收到了服務器發過來的C證書,我們驗證了C是由B簽發的,然后又驗證了B是由A簽發的,而A在我們的系統中存在,那也就證明了C這個證書的有效性。
這其中,A是根證書,B是中間證書,C是葉證書(類似樹中的葉節點)。中間證書可以有很多個,信任的鏈條可以任意長,只要最終能到根證書即可。
得益于RSA的非對稱性質,驗證A是否簽發了B證書很簡單:
- 計算B的 hash 值(算法隨便,比如SHA1)
- 使用A的私鑰對該hash進行加密,加密以后的內容叫做「簽名(Signature)」
- 將該「簽名」附在B證書中
A使用自己的私鑰給B生成簽名的過程也就是「簽發證書」,當我們收到B證書時,首先使用A證書的公鑰(公鑰存儲在證書中解開簽名獲得hash)計算B的hash,如果兩個hash匹配,說明B確實是由 A 簽發的。
重復上面的過程,直到根證書,就可以驗證某個證書的有效性。
本文內容為原創,轉載請注明出處!