程序員之網絡安全系列(五):數字證書以及12306的證書問題

系列目錄:html

前文回顧

假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去程序員

  1. 如何保證隔壁老王不能看到情書內容?(保密性)
  2. 如何保證隔壁老王不修改情書的內容?(完整性)
  3. 如何保證隔壁老王不冒充明明?(身份認證)
  4. 如何保證實明不可否認情書是本身寫的?(來源的不能否認)

程序員之網絡安全系列(二):如何安全保存用戶密碼及哈希算法 咱們保證了數據的完整性算法

程序員之網絡安全系列(三):數據加密之對稱加密算法
咱們對數據進行了加密瀏覽器

程序員之網絡安全系列(四):數據加密之非對稱加密算法
咱們使用了非對稱密鑰算法,咱們讓「隔壁王叔叔」傳遞了祕鑰。安全

中間人攻擊

上面幾步仍是不夠的,好比王叔叔在交換祕鑰的過程當中作了手腳呢?網絡

如何作手腳?看下圖:性能

  1. 王叔叔本身生成一個公私鑰,和明明以及麗麗交換。
  2. 王叔叔冒充麗麗把本身的公鑰發給明明。
  3. 明明用王叔叔的公鑰對信件加密。
  4. 王叔叔用本身的私鑰解密就能夠看到明明給麗麗的郵件。
  5. 王叔叔冒充明明把本身的公鑰發給麗麗。
  6. 麗麗用王叔叔的公鑰對信件加密。
  7. 王叔叔用本身的私鑰解密就能夠看到麗麗給明明內容。

那麼明明如何知道王叔叔給的公鑰就是麗麗的公鑰呢?那麼就引入了數字證書網站

數字證書

概念介紹

那麼王叔叔要讓明明相信他給的公鑰就是麗麗的公鑰,那麼他能夠開一個證實,好比找權威機構「敏捷的水」給開個介紹信,介紹信上給加個公章。那麼這裏的介紹性就是數字證書, 公章就是數字簽名, 那麼"敏捷的水"就是頒發證書的機構CA(Certificate Authority),也就是證書受權中心ui

CA CA 是「Certificate Authority」的縮寫,也叫「證書受權中心」。
它是負責管理和簽發證書的第三方機構,就比如例子裏面的「敏捷的水」。通常來講,CA 必須是你們都信任的、承認的。所以它必須具備足夠的權威性。只有明明和麗麗都信任的人才能來證實,對吧?加密

CA證書: CA 證書,就是CA頒發的證書。

證書之間的信任關係: 用一個證書來證實另外一個證書是真實可信。

證書信任鏈: 證書之間的信任關係,是能夠嵌套的。好比,A 信任 A1,A1 信任 A2,A2 信任 A3......,這就是證書的信任鏈。只要你信任鏈上的第一個證書,那後續的證書,都是能夠信任的。

根證書(Root Certificate): 下圖,處於最頂上的樹根位置的那個證書,就是「根證書」。除了根證書,其它證書都要依靠上一級的證書來證實本身。那誰來證實「根證書」?根證書本身證實本身,這時候咱們用戶就須要本身選擇是否相信某個根證書。

根證書是整個證書體系安全的根本。若是某個證書體系中,根證書再也不可信了,那麼全部被根證書所信任的其它證書,也就再也不可信了。  

證書內容

咱們看一下亞馬遜的證書,當咱們點擊瀏覽器左邊綠色的鎖時,咱們能夠看到以下的證書。

咱們挑重點的解釋一下

  • Issuer (證書的發佈機構)
    指出是什麼機構發佈的這個證書,也就是指明這個證書是哪一個公司建立的(只是建立證書,不是指證書的使用者)。對於上面的這個證書來講,就是指"Symantec Corporation"這個機構。

  • Not valid before, Not valid after (證書的有效期)

  • Public key (公鑰)


這個咱們在前面介紹公鑰密碼體制時介紹過,公鑰是用來對消息進行加密的。

  • Subject (主題)

這個證書是發佈給誰的,或者說證書的全部者,通常是某我的或者某個公司名稱、機構的名稱、公司網站的網址等。

  • Signature algorithm (簽名所使用的算法)

就是指的這個數字證書的數字簽名所使用的加密算法,這樣就可使用證書發佈機構的證書裏面的公鑰,根據這個算法對指紋進行解密,指紋的加密結果就是數字簽名。

  • Thumbprint, Thumbprint algorithm (指紋以及指紋算法)

這個是用來保證證書的完整性的,也就是說確保證書沒有被修改過,其原理就是在發佈證書時,發佈者根據指紋算法(一個hash算法)計算整個證書的hash值(指紋)並和證書放在一塊兒,使用者在打開證書時,本身也根據指紋算法計算一下證書的hash值(指紋),若是二者一致,就說明證書沒有被修改過,由於證書的內容被修改後,根據證書的內容計算的出的hash值(指紋)是會變化的。 注意,這個指紋會使用CA這個證書機構的私鑰用簽名算法(Signature algorithm)加密後和證書放在一塊兒,只有用CA的公鑰才能解開這個簽名。

證書是如何保證身份認證的

申請證書:

  1. Amazon.com 向Symantec 公司(CA) 申請證書。
  2. Symantec(CA) 生成一對公鑰A和私鑰B。
  3. Symantec(CA) 有本身的公鑰C和私鑰D。
  4. Symantec(CA) 把Issuer,公鑰A,Subject(通常是網站的域名),Valid from,Valid to等信息以明文的形式寫到證書裏面,而後用一個指紋算法(SHA1或者MD5
    )計算出這些數字證書內容的一個指紋(摘要),並把指紋和指紋算法用本身的私鑰D進行加密,而後和證書的內容一塊兒發給Amazon.com。
  5. Symantec(CA) 把私鑰B給Amazon.com.

如何使用證書

  1. 用戶訪問amazon.com 這個網站
  2. amazon.com 把證書發給用戶
  3. 瀏覽器讀取證書。
  4. 瀏覽器發現證書機構是Symantec,而後會在操做系統中受信任的發佈機構的證書中去找Symantec的證書,若是找不到,那說明證書的發佈機構是個假的,或者不是被權威機構認證的,證書可能有問題,程序會給出一個錯誤信息。
  5. 若是在系統中找到了Symantec的證書,那麼應用程序就會從證書中取出Symantec的公鑰C,而後對amzon.com公司的證書裏面的指紋和指紋算法用這個公鑰C進行解密,而後使用這個指紋算法計算amazon.com證書的指紋,將這個計算的指紋與放在證書中的指紋對比,若是一致,說明amazon.com的證書確定沒有被修改過而且證書是Symantec發佈的,證書中的公鑰確定是amazon.com的公鑰A, 而後咱們就能夠用這個公鑰A和amazon.com進行通訊,由於只有amazon.com 有私鑰B, 因此只有amazon.com才能解開信息。

注意 權威機構的證書都是內置在操做系統裏的。

因而可知,一個證書受不受信任,那就要看你要不要添加到操做系統裏,權威的認證機構的證書都內置在操做系統裏的。

另外,咱們本身也能夠製做自簽名的證書,可是須要別人承認你,這個在企業內部或者開發階段是能夠,咱們能夠本身製做一個證書添加到操做系統裏。

那麼,問題來了,當你訪問https://www.12306.cn 時,你就會獲得下面的結果

這是爲何呢?

我相信你看完本文應該清楚,那是由於12306 本身給本身發了個證書,而這個證書默認是沒有被操做系統信任,

可是當我把根證書添加到操做系統後,依然是https://www.12306.cn 不行,而後我發現是證書對應的域名不對,證書對應的域名是https://kyfw.12306.cn 訪問這個域名後,雖然證書驗證經過,可是瀏覽器的鎖仍是沒有變綠

爲何呢? 看提示,是由於12306使用了一個比較弱的機密算法(This site uses a weak security configuration (SHA-1 signatures), so your connection may not be private.),我猜他們是爲了性能??

可是,就算瀏覽器地址欄的鎖不能變綠,咱們還得訂票不是嗎?

我以爲12306可能須要一個操做系統內置的認證機構來發一個證書,否則普通的用戶根本不知道怎麼安裝證書,若是不使用https,那麼安全性如何獲得保證呢?

最後

回到開頭的例子,明明和麗麗能夠找一個權威機構來發一個證書,並且本身都內置了這個權威機構的證書。當王叔叔把麗麗的證書給明明時,明明就能夠知道證書是不麗麗給的,所以就能夠肯定證書裏的公鑰是不是麗麗的,若是能夠肯定是麗麗的,那麼就能夠確保加密的內容只有麗麗能夠解開,由於只有麗麗有對應的私鑰。

相關文章
相關標籤/搜索