我們在上網的時候會發現有些網址是https開頭的,很多人都知道https代表著安全和加密,但有時候當我們訪問https網址時,會遇到下面這樣的證書錯誤:

臥槽這什么鬼?好像很多人在這里都會直接無視瀏覽器的警告,然后點“繼續瀏覽此網站(不推薦)”,可是“不推薦”三個字這么大呢,還一個大大的紅叉呢,怎么看都覺得挺不靠譜的。話說回來,“證書”到底是個什么東西呢,它是用來干什么的呢?
保衛信息安全的SSL/TLS
我們平時上網訪問的http開頭的網址都是不經過任何加密的,換句話說,你的瀏覽器和網站服務器之間的通訊是能夠被任意竊聽、劫持和篡改的,聽上去很恐怖是吧?實際上這樣的事事每天都在發生,只是其中絕大部分都是無關緊要的信息罷了。不過總有一些信息我們絕對不想讓別人知道,比如說賬號、密碼、銀行卡之類的,但有一些服務需要我們提交這樣的信息,這時https便承擔起了保護敏感信息安全的重任。其實,https相當于在普通的HTTP協議上額外增加了一層用于加密的SSL/TLS協議,除了HTTP之外,其他一些如FTP、IMAP等協議都可以通過SSL/TLS來實現安全傳輸。
然而,加密并不是一件很容易的事情,而是一個十分縝密而復雜的學科,我們稱之為“密碼學”(cryptography)。如果我們研究一下SSL/TLS協議的構造,會發現它實際上是一個集人類所有密碼學技術之大成的產物,其復雜程度可想而知。為了說清楚“證書”到底是怎么回事,我們先簡單看看SSL/TLS都做了些什么。
一把鎖和兩把鎖
SSL/TLS中使用對稱加密算法對傳輸的信息進行加密,同時還會使用公鑰密碼算法來交換對稱密碼的密鑰。這句話聽上去有點繞,我們用兩個小故事來說說為什么會這樣。
小明要給小紅寄一份秘密禮物,這個禮物挺大的,于是他將禮物裝在一個大箱子里面,然后在外面加了一把鎖。小紅收到之后,她需要打開箱子上的鎖,但是鎖是小明的,只有小明有鑰匙。怎么辦呢?小明可以約小紅在咖啡館見個面,然后當面把鑰匙交給她,但在互聯網中我們并沒有這么一條路可以走,我們現在假設他們見不了面,看看小明還有什么別的辦法沒有。
小明很聰明,他想了一個巧妙的辦法。他把禮物箱子的鑰匙裝在一個小盒子里,然后加上了一把鎖寄給小紅,并在盒子外面寫了一張紙條,讓小紅收到盒子之后在原來的鎖旁邊再加上一把她自己的鎖,然后把盒子再寄回給小明。小紅照做了,于是盒子又回到了小明手里,現在上面有兩把鎖,一把是小明的,另一把是小紅的。小明用鑰匙把自己的鎖打開并拿掉,然后把盒子又重新寄回給小紅,現在盒子上只有小紅的鎖了,于是小紅可以用自己的鑰匙把鎖打開,取出里面的禮物箱子鑰匙,再用這個鑰匙打開那個禮物箱子。
誠然,小明一開始就可以用兩把鎖的方法來直接寄他的禮物箱子,但是這里有個問題,兩把鎖的方法需要把東西來回郵寄三次,而禮物箱子很大,不方便這樣折騰,而如果只是一把禮物箱子的鑰匙,來回折騰幾次也問題不大。
其實,SSL/TLS就是這樣來加密信息的。一把鎖的方法相當于對稱密碼,它速度快效率高,可以處理大量的數據,但對方需要密鑰才能解密,而禮物箱子的鑰匙就是對稱密碼的密鑰;兩把鎖的方法相當于公鑰密碼,它速度慢,不適合處理大量的數據,但可以用它來安全地傳送對稱密碼的密鑰。
真的鎖和假的鎖
你以為有了加密就萬事大吉了?假設小蘭想騙到禮物箱子的鑰匙,她有什么辦法呢?我們再回憶一下兩把鎖加密的那個過程,一開始小明把加上自己的鎖的盒子寄給小紅,如果小蘭能夠在途中把這個盒子攔下來,她可以加上自己的鎖然后再寄回給小明,小明其實沒辦法判斷新加的那把鎖到底是不是小紅的,他把自己的鎖打開并去掉,然后重新寄出去,這時小蘭再次把盒子攔下來,現在盒子上面只有小蘭的鎖,于是小蘭毫無難度地拿到了禮物箱子的鑰匙。
上面這個故事的關鍵問題在于,小明怎么知道新加的那把鎖是不是小紅的?我們假設小紅的鎖上面有個防偽標簽,比如是個二維碼,小明用手機掃描這個二維碼,可以跳出一個公安局的網頁來驗證小紅的身份,這樣就可以防止小蘭用假的鎖來招搖撞騙了。
其實,小紅鎖上的這個防偽標簽也就是我們在SSL/TLS里所說的“證書”,它可以讓我們驗證網站的身份,確保我們的信息不被小蘭這樣的壞人騙走。小紅的防偽標簽是由公安局頒發并且提供驗證的,網站的證書也差不多,它是由一些叫做“認證機構”(certificate authority)的組織頒發并提供驗證的。
盡職盡責的瀏覽器
那么,瀏覽器為什么有時候會彈出證書錯誤的提示呢?那是因為瀏覽器在對網站提供的證書進行驗證的時候發現了一些問題。在訪問https網址時,瀏覽器會對網站提供的證書進行驗證,通常包括這樣幾條:
1. 證書是否由可信的認證機構頒發并經過該認證機構的驗證
2. 證書是否在有效期內,是否已經被聲明作廢
3. 證書中記錄的域名是否與正在訪問的網站域名一致
你看,你的瀏覽器還是相當專業和負責的,那么反過來說,如果上面這些驗證中的任何一條出了問題,瀏覽器就會彈出警告說這個證書是有問題的,也就是我們開頭看到的那個畫面。
證書錯誤到底代表什么?
那么,證書有問題又意味著什么呢?我們一條一條地看。
首先,如果第1條遇到了問題,說明這個證書不是由可信的認證機構頒發的。證書也只不過是按照特定算法所生成的數字簽名,因此實際上任何人都可以自己給自己頒發證書,只是可信或不可信的區別而已,就好像你可以自己給自己發一張身份證,但別人可不相信這個證,而公安局給你發一張身份證就非常可信。有些網站會使用自己頒發的證書,其中最有名的莫過于買火車票的12306了,但對于瀏覽器來說,網站自己頒發的證書是不可信的(下圖),于是會彈出警告,因為不可信的證書很容易被偽造,就好像你可以給自己發身份證,也可以給你爸發一張身份證,反正這些身份證都不可信,別人也就無法辨認真偽。

其次,如果第2條遇到了問題,說明網站的證書已經過期或者作廢了,這也有可能代表這個證書是偽造的。證書之所以難以被偽造,是因為只有擁有證書私鑰的人才能生成合法的證書,而證書私鑰就相當于我們剛才故事中小紅自己的鎖所對應的那把鑰匙。萬一證書的私鑰泄露了,別人就可以偽造證書,在這種情況下,網站會聲明這張證書作廢,你的瀏覽器遇到這樣的證書也會彈出警告,因為作廢的證書很有可能是偽造的。
最后,如果第3條遇到了問題,說明證書中記錄的域名和你實際訪問的域名不一致,比如說你上的明明是百度,但證書卻是360的,這有可能表示有人用其他網站的證書進行掉包,實際上也相當于是一種偽造,因此瀏覽器也會彈出警告。
總之,證書錯誤意味著瀏覽器懷疑這個網站的證書可能被偽造了,而一旦證書被偽造,就像上面故事里的小蘭一樣,你的通信內容就有可能被別人攔截甚至篡改,而https網址上所傳輸的信息往往都非常敏感,比如賬號密碼以及銀行交易信息等等,因此一旦被竊取,后果可能會非常嚴重。
我該怎么辦?
如果遇到瀏覽器彈出證書錯誤,貿然忽略錯誤而繼續訪問網站往往是有風險的,尤其是在咖啡廳等公共Wifi環境中,因為這樣的環境十分有利于發動證書攻擊。如果你在訪問像銀行、支付寶等網站時遇到證書錯誤,還是聽聽瀏覽器的建議吧,不要繼續訪問了,如果你碰巧在公共Wifi環境下,最好回家或者換個地方再試試看。對于12306這樣堅持使用自己頒發的證書的網站,可以將網站的證書添加到電腦的可信證書列表中,但這樣做本身也是存在風險的,因為不可信的證書很容易被偽造,當然,對于這種情況,作為用戶來說也并沒有什么更好的辦法。
最后再說一句,即便瀏覽器沒有彈出證書錯誤,也不能排除有惡意程序在你的電腦上劫持證書的可能性(對此有興趣的可以搜索一下“Superfish”),因此提醒大家保持良好的上網習慣,不要點擊可疑的鏈接或者運行可疑的程序。
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!