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


系列目錄:

前文回顧

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

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

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

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

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

中間人攻擊

上面幾步還是不夠的,比如王叔叔在交換秘鑰的過程中做了手腳呢?

如何做手腳?看下圖:

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

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

數字證書

概念介紹

那么王叔叔要讓明明相信他給的公鑰就是麗麗的公鑰,那么他可以開一個證明,比如找權威機構“敏捷的水”給開個介紹信,介紹信上給加個公章。那么這里的介紹性就是數字證書, 公章就是數字簽名, 那么"敏捷的水"就是頒發證書的機構CA(Certificate Authority),也就是證書授權中心

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,那么安全性如何得到保證呢?

最后

回到開頭的例子,明明和麗麗可以找一個權威機構來發一個證書,而且自己都內置了這個權威機構的證書。當王叔叔把麗麗的證書給明明時,明明就可以知道證書是不麗麗給的,因此就可以確定證書里的公鑰是否是麗麗的,如果可以確定是麗麗的,那么就可以確保加密的內容只有麗麗可以解開,因為只有麗麗有對應的私鑰。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM