如何驗證數字證書的真偽


轉載自https://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html

  hyddd原創,轉載請說明出處:>

  最近看會Session hijack的東西,劫持現在已經實現,yahoo等一些沒有用Https協議的郵箱被成功地劫持了(遲下發文章),由於對Https不熟悉,所以看了一下為什么Https的會話不能劫持。

  本文主要介紹的SSL中的涉及到的"數字證書"這個東東。

一.什么是數字證書?

  數字證書是一種權威性的電子文檔。它提供了一種在Internet上驗證您身份的方式,其作用類似於司機的駕駛執照或日常生活中的身份證。它是由一個由權威機構----CA證書授權(Certificate Authority)中心發行的,人們可以在互聯網交往中用它來識別對方的身份。當然在數字證書認證的過程中,證書認證中心(CA)作為權威的、公正的、 可信賴的第三方,其作用是至關重要的。

  Ok,知道什么是數字證書后,先看看它長的什么樣吧:>,文件縮略圖如下:

  

  雙擊后打開如下:

  

 

二.CA認證機構/CA認證中心

  1.CA認證中心是什么?

  CA認證中心是負責簽發管理認證數字證書的機構,是基於國際互聯網平台建立的一個公正,權威,可信賴的第三方組織機構。

  2.世界上的CA認證中心不止一間,那他們之間的關系是什么(CA認證中心之間的關系)?

  嗯,回答這個問題之前可以先看看下圖:

  

  從圖中可以看到,CA認證中心之間是一個樹狀結構,根CA認證中心可以授權多個二級的CA認證中心,同理二級CA認證中心也可以授權多個3級的CA認證中心...如果你是數字證書申請人(比如說:交通銀行),你可以向根CA認證中心,或者二級,三級的CA認證中心申請數字證書,這是沒有限制的,當你成功申請后,你就稱為了數字證書所有人。值得注意的是,根CA認證中心是有多個的,也就是說會有多棵這樣的結構樹。FireFox里面默認記錄了一些根CA認證機構的信息,如圖:

  

  看到這里,肯定有人會問,如果有現在新的根CA認證機構成立,FireFox肯定是沒有這個CA認證中心的信息的(這些信息是用來驗證子CA認證機構的,很重要,后面來會講到),那怎么辦呢?嗯~~確實,如果今天2009-1-8日突然在哪里成立一個新的CA認證中心,我FireFox里面肯定沒有他的信息的!但解決辦法還是有的,看上圖,可以找到一個"Import"按鈕,當我們遇到這樣的倒霉事時,只有自己去下載並導入根CA認證中心信息了(其實這樣做是不太安全的!),或者期望FireFox的升級會升級這些信息,但這個我是不確定的。

  3.為什么CA認證中心是權威的?

  其實搞清楚這個問題后,你也會真正了解“CA認證中心是如何授權子CA認證中心的?”,“為什么偽造的數字證書是無效的”,“為什么數字證書是一種權威性的電子文檔”等等一系列的問題。並且SSL可以說是建立在CA認證中心的權威,公正,可信賴的基礎上的,如果CA認證中心的信息可以被偽造的,那么SSL的一切就完了......

  首先,我們先來看看,在FireFox里記錄的CA認證中心的信息到底是什么東西??見上圖,單擊某項,Export導出....你會看到導出的東西很面熟,原來就是數字證書!!

  實際上每個CA認證中心/數字證書所有人,他們都有一個數字證書,和屬於自己的RSA公鑰和密鑰,這些是他們的父CA認證中心給他們頒發的,這里先大概解釋一下RSA,RSA是一種非對稱加密的算法,它的公鑰和密鑰是配對的,如果用公鑰加密,用私鑰解密就可以得到明文;如果用私鑰加密,用公鑰解密也可以得到原來的明文,這由RSA特性決定,他效果可以用下圖概括:

  

  對於私鑰:CA認證中心/數字證書所有人自己保存,不公開。

  對於公鑰:CA認證中心/數字證書所有人會把公鑰存在他的CA認證中心的數字證書內。

  (1).首先,CA認證中心/數字證書所有人,它在網絡上的表現形式只能是一張數字證書!所以我們可以把某張數字證書等價於某個CA認證中心/數字證書所有人。這樣的話,驗證數字證書的合法性就可以確定CA認證中心/數字證書所有人是否是合法的!!!

  (2).數字證書使用數字簽名作驗證!這里簡單說明一下數字簽名的過程:你從Firefox/IE導出的數字證書包含3個部分:證書內容(F),加密算法(A),F加密密文(F') (數字證書結構會在第三部分詳細介紹),在這里,A不是一個算法,而是兩個,所以密文F'是F兩次加密后的結果。

  首先,F會被散列算法SHA1計算出hash值h1(稱為128bit的摘要),然后h1會被發布這個數字簽名的CA認證機構的用私鑰進行RSA加密,注意:是發布這個數字簽名的CA認證機構,如果現在被加密的數字證書是屬於二級CA認證機構的,那么用來加密這個證書的私鑰是根CA認證機構的私鑰!!RAS加密完后,就形成密文F'。

  當你要驗證這個數字證書可信/合法性時,你需要找到你的上一層CA認證中心的數字證書,並且從中獲取公鑰,把數據證書中的密文F'進行RSA解密,如果得出的值h2和h1比較(h1可以立即用數據證書中的F現場算出來),如果相等,則認為證書是可信的,合法的!由於你是不可能知道上一層CA認證中心的私鑰,所以你無法偽造一個可以用上一層CA認證中心公鑰解密的數字證書!!

  詳細流程圖如下:

  

   由於一個數字證書基於上層的數字證書作驗證,那上層的數字證書又是否合法呢??這就會出現一直遞歸上去的現象,事實也是這樣的,驗證一個證書是否合法,需要驗證到他的最頂層的根證書是否合法!從其他的文章弄來的這幅圖很好地表達了這個思想:

   

  這里肯定又有人會問,那么最頂層的CA認證中心如何證明它的合法性呢?.......呵~這就是為什么FireFox要預先把一些最頂層(這里的"最頂層"和"根"是同一個概念)的CA認證中心的證書加入到權威信任列表中了,因為,最頂層CA認證中心沒有辦法證明,所以,最頂層的CA認證中心是總是受信任的!!而事實上,最頂層的CA認證中心在是世界上也是為數不多的。這里大家應該了解為什么我剛才說自己導入根CA證書是不太安全的,因為你無法驗證。

三.數字證書的組成

  可以先看看我從Firefox的證書截圖:

  

  1.Certificate(證書):

   (1).Common Name(證書所有人姓名,簡稱CN,其實就是證書的名字,如第一幅圖看到的:ABA.ECOMRoot....)

   (2).Version(版本,現在一般是V3了)

   (3).Issuer(發證機關)

   (4).Validity(有效日期)

   (5).Subject(證書信息,你會發現它和Issuer里面的內容是一樣的)

   (6).Subject's Public Key Info(證書所有人公鑰,剛才所說的公鑰就是這個!)

   (7).Extension(擴展信息)

   (8).Certificate Signature Algorithm(公鑰加密算法)、

    以上這幾項就是上面所說的證書內容(F)。 

  2.Certificate Signature Algorithm:

    這是描述證書的加密算法,就是上所說的加密算法(A),看它的Fireld Value,一般會寫:PKCS #1 SHA-1 With RSA Encryption

  3.Certificate Signature Value:

   這記錄的是證書被加密后的結果,相當於上面說講的F'。

四.數字證書的驗證

  要回答數字證書是如何驗證的,首先要知道數字證書是要驗證些什么東西:>,數字證書的驗證,上面已經講了一些,這做一個總結:

  1.可信性驗證/合法性驗證:這個剛才已經說的很明白了吧:>

  2.完整性驗證:在驗證可信性的過程中,h1和h2的比較,其實已經順便驗證其完整性了。

  3.有效性驗證:比如驗證它的Vilidity值,看是否過期...

 

  先寫這么多,其他以后補充!並且可能有些地方寫得會比較亂,這個我稍后會改正:>~歡迎拍磚!

 

五.參考資料:

1.http://baike.baidu.com/view/204415.htm

2.http://finance.sina.com.cn/money/roll/20080401/00404692291.shtml

3.http://blog.csdn.net/sfdev/archive/2008/03/12/2174305.aspx

4.http://man.chinaunix.net/develop/rfc/RFC2313.txt

5.http://www.zhlmmc.com/diary/14554


免責聲明!

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



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