1. 程式人生 > >深入理解加密、解密、數字簽名(簽名證書、加密證書)的組成和數字證書

深入理解加密、解密、數字簽名(簽名證書、加密證書)的組成和數字證書

 深入理解加密、解密、數字簽名和數字證書

 隨著電子商務的迅速發展,資訊保安已成為焦點問題之一,尤其是網上支付和網路銀行對資訊保安的要求顯得更為突出。為了能在因特網上開展安全的電子商務活動,公開金鑰基礎設施( PKI, Public Key Infrastructure )逐步在國內外得到廣泛應用。我們是否真的需要 PKI , PKI 究竟有什麼用?下面通過一個案例一步步地來剖析這個問題 : 甲想將一份合同檔案通過 Internet 發給遠在國外的乙,此合同檔案對雙方非常重要,不能有絲毫差錯,而且此檔案絕對不能被其他人得知其內容。如何才能實現這個合同的安全傳送?
問題 1: 最自然的想法是,甲必須對檔案加密才能保證不被其他人檢視其內容,那麼 , 到底應該用什麼加密技術,才能使合同傳送既安全又快速呢 ?
    可以採用一些成熟的對稱加密演算法 , 如 DES 、 3DES 、 RC5 等對檔案加密。對稱加密採用了對稱密碼編碼技術,它的特點是檔案加密和解密使用相同的金鑰,即加密金鑰也可以用做解密金鑰,這種方法在密碼學中叫做對稱加密演算法,


問題 2: 如果黑客截獲此檔案,是否用同一演算法就可以解密此檔案呢 ?
    不可以 , 因為加密和解密均需要兩個元件 : 加密演算法和對稱金鑰 , 加密演算法需要用一個對稱金鑰來解密 , 黑客並不知道此金鑰。

 
問題 3: 既然黑客不知金鑰,那麼乙怎樣才能安全地得到其金鑰呢?用電話通知,若電話被竊聽,通過 Internet 發此金鑰給乙,可能被黑客截獲,怎麼辦 ?
    方法是用非對稱金鑰演算法加密對稱金鑰後進行傳送。與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰:公開金鑰( Public Key )和私有金鑰( Private Key )。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫做非對稱加密演算法 ( 公 / 私鑰可由專門軟體生成 ) 。甲乙雙方各有一對公 / 私鑰,公鑰可在 Internet 上傳送,私鑰自己儲存。這樣甲就可以用乙的公鑰加密問題 1 中提到的對稱加密演算法中的對稱金鑰。即使黑客截獲到此金鑰,也會因為黑客不知乙的私鑰,而解不開對稱金鑰,因此也解不開密文,只有乙才能解開密文。


問題 4 :既然甲可以用乙的公鑰加密其對稱金鑰,為什麼不直接用乙的公鑰加密其檔案呢?這樣不僅簡單,而且省去了用對稱加密演算法加密檔案的步驟?
    不可以這麼做。因為非對稱密碼演算法有兩個缺點 : 加密速度慢 , 比對稱加密演算法慢 10 ~ 100 倍 , 因此只可用其加密小資料 ( 如對稱金鑰 ) ,另外加密後會導致得到的密文變長。因此一般採用對稱加密演算法加密其檔案 , 然後用非對稱演算法加密對稱演算法所用到的對稱金鑰。


問題 5 : 如果黑客截獲到密文,同樣也截獲到用公鑰加密的對稱金鑰,由於黑客無乙的私鑰,因此他解不開對稱金鑰,但如果他用對稱加密演算法加密一份假檔案 , 並用乙的公鑰加密一份假檔案的對稱金鑰,併發給乙,乙會以為收到的是甲傳送的檔案,會用其私鑰解密假檔案 , 並很高興地閱讀其內容,但卻不知已經被替換。換句話說,乙並不知道這不是甲發給他的,怎麼辦 ? 
    答案是用數字簽名證明其身份。數字簽名是通過雜湊演算法 , 如 MD5 、 SHA-1 等演算法從大塊的資料中提取一個摘要。而從這個摘要中不能通過雜湊演算法恢復出任何一點原文,即得到的摘要不會透露出任何最初明文的資訊,但如果原資訊受到任何改動,得到的摘要卻肯定會有所不同。因此甲可以對檔案進行雜湊演算法得到摘要,並用自己的私鑰加密 ( 因為非對稱演算法可逆,即用私鑰可解開公鑰加密的檔案,反之亦然 ) ,這樣即使黑客截獲也無用。因為黑客不會從摘要內獲得任何資訊,但乙卻不一樣,他可用甲的公鑰解密,得到其摘要 ( 如果用甲的公鑰能夠解開此摘要,說明此摘要肯定是甲發的,因為只有甲的公鑰才能解開用甲的私鑰加密的資訊 , 而甲的私鑰只有甲自己知道 ) ,並對收到的檔案 ( 解密後的合同檔案 ) 也進行同樣的雜湊演算法,通過比較其摘要是否一樣 , 就可得知此檔案是否被篡改過  ( 因為若摘要相同,則肯定資訊未被改動,這是雜湊演算法的特點 ) 。這樣不僅解決了證明發送人身份的問題,同時還解決了檔案是否被篡改問題。


問題 6 : 通過對稱加密演算法加密其檔案,再通過非對稱演算法加密其對稱金鑰 , 又通過雜湊演算法證明其傳送者身份和其資訊的正確性,這樣是否就萬無一失了 ?
    回答是否定的。問題在於乙並不能肯定他所用的所謂甲的公鑰一定是甲的 , 解決辦法是用數字證書來繫結公鑰和公鑰所屬人。
    數字證書是一個經證書授權中心數字簽名的包含公開金鑰擁有者資訊以及公開金鑰的檔案 , 是網路通訊中標識通訊各方身份資訊的一系列資料,它提供了一種在 Internet 上驗證身份的方式,其作用類似於司機的駕駛執照或日常生活中的身份證,人們可以在交往中用它來識別對方的身份。
    最簡單的證書包含一個公開金鑰、名稱以及證書授權中心的數字簽名。一般情況下證書中還包括金鑰的有效時間、發證機關 ( 證書授權中心 ) 名稱、該證書的序列號等資訊。它是由一個權威機構—— CA 機構,又稱為證書授權 (Certificate Authority) 中心發放的。 CA 機構作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。 CA 中心為每個使用公開金鑰的使用者發放一個數字證書,數字證書的作用是證明證書中列出的使用者合法擁有證書中列出的公開金鑰。 CA 機構的數字簽名使得攻擊者不能偽造和篡改證書, CA 是 PKI 的核心,負責管理 PKI 結構下的所有使用者(包括各種應用程式)的證書,把使用者的公鑰和使用者的其他資訊捆綁在一起,在網上驗證使用者的身份。
    因為數字證書是公開的,就像公開的電話簿一樣,在實踐中,傳送者(即甲)會將一份自己的數字證書的拷貝連同密文、摘要等放在一起傳送給接收者(即乙),而乙則通過驗證證書上權威機構的簽名來檢查此證書的有效性(只需用那個可信的權威機構的公鑰來驗證該證書上的簽名就可以了),如果證書檢查一切正常,那麼就可以相信包含在該證書中的公鑰的確屬於列在證書中的那個人(即甲)。

 
問題 7 : 至此似乎很安全了。但仍存在安全漏洞,例如:甲雖將合同檔案發給乙 , 但甲拒不承認在簽名所顯示的那一時刻簽署過此檔案 ( 數字簽名就相當於書面合同的文字簽名 ) ,並將此過錯歸咎於電腦,進而不履行合同,怎麼辦 ?
    解決辦法是採用可信的時鐘服務 ( 由權威機構提供 ) ,即由可信的時間源和檔案的簽名者對檔案進行聯合簽名。在書面合同中,檔案簽署的日期和簽名一樣均是十分重要的防止檔案被偽造和篡改的關鍵性內容 ( 例如合同中一般規定在檔案簽署之日起生效 ) 。在電子檔案中,由於使用者桌面時間很容易改變 ( 不準確或可人為改變 ) ,由該時間產生的時間戳不可信賴,因此需要一個第三方來提供時間戳服務(數字時間戳服務( DTS )是網上安全服務專案,由專門的機構提供)。此服務能提供電子檔案發表時間的安全保護。
    時間戳產生的過程為 : 使用者首先將需要加時間戳的檔案用雜湊編碼加密形成摘要,然後將該摘要傳送到 DTS , DTS 在加入了收到檔案摘要的日期和時間資訊後再對該檔案加密(數字簽名),然後送回使用者。因此時間戳 (time-stamp) 是一個經加密後形成的憑證文件,它包括三個部分:需加時間戳的檔案的摘要, DTS 收到檔案的日期和時間, DTS 的數字簽名。由於可信的時間源和檔案的簽名者對檔案進行了聯合簽名 , 進而阻止了文件簽名的那一方 ( 即甲方 ) 在時間上欺詐的可能性 , 因此具有不可否認性。


問題 8: 有了數字證書將公 / 私鑰和身份繫結 , 又有權威機構提供時鐘服務使其具有不可否認性 , 是不是就萬無一失了 ? 不 , 仍然有問題。乙還是不能證明對方就是甲,因為完全有可能是別人盜用了甲的私鑰 ( 如別人趁甲不在使用甲的電腦 ), 然後以甲的身份來和乙傳送資訊 , 這怎麼解決呢 ?
    解決辦法是使用強口令、認證令牌、智慧卡和生物特徵等技術對使用私鑰的使用者進行認證,以確定其是私鑰的合法使用者。
    解決這個問題之前我們先來看看目前實現的基於 PKI 的認證通常是如何工作的。以瀏覽器或者其他登記申請證書的應用程式為例說明,在第一次生成金鑰的時候會建立一個金鑰儲存,瀏覽器使用者會被提示輸入一個口令,該口令將被用於構造保護該金鑰儲存所需的加密金鑰。如果金鑰儲存只有脆弱的口令保護或根本沒有口令保護,那麼任何一個能夠訪問該電腦瀏覽器的使用者都可以訪問那些私鑰和證書。在這種場景下 , 又怎麼可能信任用 PKI 建立的身份呢 ? 正因為如此,一個強有力的 PKI 系統必須建立在對私鑰擁有者進行強認證的基礎之上,現在主要的認證技術有:強口令、認證令牌、智慧卡和生物特徵(如指紋,眼膜等認證)。
    以認證令牌舉例 : 假設使用者的私鑰被儲存在後臺伺服器的加密容器裡,要訪問私鑰,使用者必須先使用認證令牌認證(如使用者輸入賬戶名、令牌上顯示的通行碼和 PIN 等),如果認證成功,該使用者的加密容器就下載到使用者系統並解密。
通過以上問題的解決,就基本滿足了安全傳送檔案的需求。下面總結一下這個過程 , 對甲而言整個傳送過程如下 :
1. 建立對稱金鑰 ( 相應軟體生成,並且是一次性的 ) ,用其加密合同,並用乙的公鑰打包對稱金鑰。
2. 建立數字簽名,對合同進行雜湊演算法 ( 如 MD5 演算法 ) 併產生原始摘要,甲用自己的私鑰加密該摘要 ( 公 / 私鑰既可自己建立也可由 CA 提供 ) 。
3. 最後 , 甲將加密後的合同、打包後的金鑰、加密後的摘要 , 以及甲的數字證書 ( 由權威機構 CA 簽發 ) 一起發給乙。
而乙接收加密檔案後,需要完成以下動作 :
1. 接收後,用乙的私鑰解密得到對稱金鑰 , 並用對稱金鑰解開加密的合同 , 得到合同明文。
2. 通過甲的數字證書獲得屬於甲的公鑰 , 並用其解開摘要 ( 稱做摘要 1) 。
3. 對解密後的合同使用和傳送者同樣的雜湊演算法來建立摘要 ( 稱做摘要 2) 。
4. 比較摘要 1 和摘要 2, 若相同 , 則表示資訊未被篡改 , 且來自於甲。
    甲乙傳送資訊過程看似並不複雜 , 但實際上它由許多基本成分組成 , 如 : 對稱 / 非對稱金鑰密碼技術、數字證書、數字簽名、證書發放機構( CA )、公開金鑰的安全策略等 , 這其中最重要、最複雜的是證書發放機構( CA )的構建。
在此強調下證書和簽名:
    證書實際對於非對稱加密演算法(公鑰加密)來說的,一般證書包括公鑰、姓名、數字簽名三個部分。證書好比身份證,證書機構(ca)就好比是公安局,職責就是負責管理使用者的證書也就是身份證。比如我的公鑰是FrankKey,姓名是Frank Xu Lei。公安局可以給我登記,但是怎麼保證我和別的Frank XuLei區別開呢,於是公安局(證書機構)就使用我的名字和金鑰做了個組合,再使用一種雜湊演算法,得出一串值,來標識我的唯一性,這個值就是我的身份證號碼,也就是證書裡的數字簽名(訊息摘要),同時為了不能讓黑客仿造數字證書,數字證書的發行者用自己的私鑰對數字簽名進行加密,這樣,使用該數字證書的網路交易實體就可以用證書發行者的公鑰進行解密驗證。(即:數字簽名的目的是證明自己的身份的確是真實的自己而非其他人,所以需要用自己的私鑰進行加密,讓使用者用公鑰進行解密驗證,從而從技術上杜絕了偽造自己的黑客。)
    假設一個朋友給我寫信,他就可以到公安局(證書機構)來查詢我的身份證(證書)。上面包括我的個人資訊,可以保證這個公鑰就是我的。然後他把新建進行加密,郵寄給我。別人即使拆開我的信件,因為沒有金鑰進行解密,所以無法閱讀我的信件內容。這樣就保證了資訊保安。
    所以說加密不一定要證書,取決於你資料安全具體的需求。一般大型的電子商務網站都有自己特定的證書。證書管理的機構比較有名的就是VeriSign(可以 說是網際網路上的身份證管理局)。企業可以申請註冊,它會給申請者生成特定的簽名。我們自己的企業內部應用如果需要的話,可以在企業區域網內部建立企業私有的證書伺服器,來產生和管理證書。其實X.509是由國際電信聯盟(ITU-T)制定的一種定義證書格式和分佈的國際標準(相當於製作身份證的規範)。為了提供公用網路使用者目錄資訊服務,並規定了實體鑑別過程中廣泛適用的證書語法和資料介面, X.509 稱之為證書,或者說是身份證的一種形式,類似與我們現在的二代身份證,也是身份證的一種,根據特定的標準制作出來的。另外證書使用的時候還有有效期的限制,和我們的身份證的10年有效期一樣。證書也可以設定有效期。
 
附:1.U盾的工作原理介紹
一、什麼是U盾
     U盾,即工行2003年推出並獲得國家專利的客戶證書USBkey,是工行為您提供的辦理網上銀行業務的高級別安全工具。它外形酷似U盤,像一面盾牌,時刻保護著您的網上銀行資金安全。
從技術角度看,U盾是用於網上銀行電子簽名和數字認證的工具,它內建微型智慧卡處理器,採用1024位非對稱金鑰演算法對網上資料進行加密、解密和數字簽名,確保網上交易的保密性、真實性、完整性和不可否認性
二、工作原理
    U盾又作移動數字證書,它存放著你個人的數字證書,並不可讀取。同樣,銀行也記錄著你的數字證書。
當你嘗試進行網上交易時,銀行會向你傳送由時間字串,地址字串,交易資訊字串,防重放攻擊字串組合在一起進行加密後得到的字串A,你的U盾將跟據你的個人證書對字串A進行不可逆運算得到字串B,並將字串B傳送給銀行,銀行端也同時進行該不可逆運算,如果銀行運算結果和你的運算結果一致便認為你合法,交易便可以完成,如果不一致便認為你不合法,交易便會失敗。(理論上,不同的字串A不會得出相同的字串B,即一個字串A對應一個唯一的字串B;但是字串B和字串A無法得出你的數字證書,而且U盾具有不可讀取性,所以任何人都無法獲行你的數字證書。並且銀行每次都會發不同的防重放字串(隨機字串)和時間字串,所以當一次交易完成後,剛發出的B字串便不再有效。綜上所述,理論上U盾是絕對安全的****注意是理論上發生偽造概率大約為2的80次方分之一,但是如果有像變形金剛中的那種DNAbasecomputer的話。
參考文獻:http://blog.chinaunix.net/uid-23637692-id-3057988.html(介紹了PKI體系和常見證書)

2.推薦一本書籍,可以系統性學習: 《資訊保安原理與實踐》


詳解公鑰、私鑰、數字證書的概念
加密和認證
  首先我們需要區分加密和認證這兩個基本概念。
   加密是將資料資料加密,使得非法使用者即使取得加密過的資料,也無法獲取正確的資料內容,所以資料加密可以保護資料,防止監聽攻擊。其重點在於資料的安全性。身份認證是用來判斷某個身份的真實性,確認身份後,系統才可以依不同的身份給予不同的許可權。其重點在於使用者的真實性。兩者的側重點是不同的。

 
公鑰和私鑰
      公鑰和私鑰就是俗稱的不對稱加密方式,是從以前的對稱加密(使用使用者名稱與密碼)方式的提高。

      在現代密碼體制中加密和解密是採用不同的金鑰(公開金鑰),也就是非對稱金鑰密碼系統,每個通訊方均需要兩個金鑰,即公鑰和私鑰,這兩把金鑰可以互為加解密。公鑰是公開的,不需要保密,而私鑰是由個人自己持有,並且必須妥善保管和注意保密。

  公鑰私鑰的原則:

一個公鑰對應一個私鑰。
金鑰對中,讓大家都知道的是公鑰,不告訴大家,只有自己知道的,是私鑰。
如果用其中一個金鑰加密資料,則只有對應的那個金鑰才可以解密。
如果用其中一個金鑰可以進行解密資料,則該資料必然是對應的那個金鑰進行的加密。
      用電子郵件的方式說明一下原理。
      使用公鑰與私鑰的目的就是實現安全的電子郵件,必須實現如下目的:
      1. 我傳送給你的內容必須加密,在郵件的傳輸過程中不能被別人看到。
      2. 必須保證是我傳送的郵件,不是別人冒充我的。
      要達到這樣的目標必須傳送郵件的兩人都有公鑰和私鑰。
      公鑰,就是給大家用的,你可以通過電子郵件釋出,可以通過網站讓別人下載,公鑰其實是用來加密/驗章用的。私鑰,就是自己的,必須非常小心儲存,最好加上 密碼,私鑰是用來解密/簽章,首先就Key的所有權來說,私鑰只有個人擁有。公鑰與私鑰的作用是:用公鑰加密的內容只能用私鑰解密,用私鑰加密的內容只能 用公鑰解密。
      比如說,我要給你傳送一個加密的郵件。首先,我必須擁有你的公鑰,你也必須擁有我的公鑰。
      首先,我用你的公鑰給這個郵件加密,這樣就保證這個郵件不被別人看到,而且保證這個郵件在傳送過程中沒有被修改。你收到郵件後,用你的私鑰就可以解密,就能看到內容。
      其次我用我的私鑰給這個郵件加密,傳送到你手裡後,你可以用我的公鑰解密。因為私鑰只有我手裡有,這樣就保證了這個郵件是我傳送的。

      非對稱金鑰密碼的主要應用就是公鑰加密和公鑰認證,而公鑰加密的過程和公鑰認證的過程是不一樣的,下面我就詳細講解一下兩者的區別。

基於公開金鑰的加密過程

    比如有兩個使用者Alice和Bob,Alice想把一段明文通過雙鑰加密的技術傳送給Bob,Bob有一對公鑰和私鑰,那麼加密解密的過程如下:

Bob將他的公開金鑰傳送給Alice。
Alice用Bob的公開金鑰加密她的訊息,然後傳送給Bob。
Bob用他的私人金鑰解密Alice的訊息。
 Alice使用Bob的公鑰進行加密,Bob用自己的私鑰進行解密。

基於公開金鑰的認證過程

  身份認證和加密就不同了,主要用來鑑別使用者的真偽。這裡我們只要能夠鑑別一個使用者的私鑰是正確的,就可以鑑別這個使用者的真偽。

  還是Alice和Bob這兩個使用者,Alice想讓Bob知道自己是真實的Alice,而不是假冒的,因此Alice只要使用公鑰密碼學對檔案 簽名傳送給Bob,Bob使用Alice的公鑰對檔案進行解密,如果可以解密成功,則證明Alice的私鑰是正確的,因而就完成了對Alice的身份鑑 別。整個身份認證的過程如下:

Alice用她的私人金鑰對檔案加密,從而對檔案簽名。
Alice將簽名的檔案傳送給Bob。
Bob用Alice的公鑰解密檔案,從而驗證簽名。
 Alice使用自己的私鑰加密,Bob用Alice的公鑰進行解密。

根證書

       根證書是CA認證中心給自己頒發的證書,是信任鏈的起始點。安裝根證書意味著對這個CA認證中心的信任。

總結

      根據非對稱密碼學的原理,每個證書持有人都有一對公鑰和私鑰,這兩把金鑰可以互為加解密。公鑰是公開的,不需要保密,而私鑰是由證書持有人自己持有,並且必須妥善保管和注意保密。

      數字證書則是由證書認證機構(CA)對證書申請者真實身份驗證之後,用CA的根證書對申請人的一些基本資訊以及申請人的公鑰進行簽名(相當於加蓋發證書機構的公章)後形成的一個數字檔案。CA完成簽發證書後,會將證書釋出在CA的證書庫(目錄伺服器)中,任何人都可以查詢和下載,因此數字證書和公鑰一樣是公開的。  

      可以這樣說,數字證書就是經過CA認證過的公鑰,而私鑰一般情況都是由證書持有者在自己本地生成的,由證書持有者自己負責保管。具體使用時,簽名操作是發 送方用私鑰進行簽名,接受方用傳送方證書來驗證簽名;加密操作則是用接受方的證書進行加密,接受方用自己的私鑰進行解密。
  
  
  
  
  
  
  
   簽名證書VS加密證書
   從證書的用途來看,數字證書可以分為:
 簽名證書:主要用於對使用者資訊進行簽名,以保證資訊的不可否認性。
 加密證書:主要用於對使用者傳送資訊進行加密,以保證資訊的真實性和完整性。
 
什麼是加密證書和簽名證書?
      
    數字證書可分為簽名證書和加密證書。

    簽名證書主要用於對使用者資訊進行簽名,以保證資訊的有效性和不可否認性;

    加密證書主要用於對使用者傳送資訊進行加密,以保證資訊的保密性和完整性。

    每個證書都包含一對金鑰即簽名公鑰和簽名私鑰,加密公鑰和加密私鑰,將簽名證書和加密證書的公鑰公佈於外。

    簽名時,用簽名證書的私鑰進行簽名,其他使用者可以利用公佈於外網的簽名公鑰對簽名進行驗證。

    加密時,使用者B利用使用者A公佈於外網的加密公鑰對資訊進行加密傳送給使用者A,使用者A利用自己的加密私鑰對加密後的信

    息進行解密得到完整的明文資訊。
 
=================================================================
 
數字證書格式-摘要
 版本 :該證書使用的是哪種版本的X.509標準
 序列號:本項是CA分配給每一個證書的唯一的數字型編號,證書序列號的長度在不同的
  CA系統中是可配置的。
 簽名演算法:本項用來指定頒發機構CA簽發證書時使用的簽名演算法
 頒發者:issuer 本項標識了頒發該證書的機構DN
 有效期:validity 本項是證書的有效期和終止日期
 主題:subject 證書擁有者的唯一是別名,這個欄位必須是非空的。
     有效的DN(Distinct Name)標識:
       c          country code (一般是c=cn)
       o          organization(組織)
       ou        organizational unit name(組織單位名)
       cn        common name (普通名)
       e          email (郵件地址)
       l           locality name (地址)
       st         state, or province name (國家或省份名)
       dc        domain Component (領域)
       uid      user id (使用者識別符號)
       t          title (標題)
       sn        device serial number name
 公鑰 public key: 本項用來標識公鑰,公鑰演算法和公鑰長度。
 微縮圖演算法:和證書本身沒多大關係,就是雜湊演算法,通常用MD5或SHA1.
 微縮圖:是指對整個證書進行hash運算之後生成的一段資料,就是對證書的雜湊摘要。
 
 
 
 
 
 
 
 
 SM2國密演算法證書解析
 一、數字證書的組成

1)證書資料結構

數字證書使用ASN.1編碼,證書檔案以二進位制或Base64格式存放,資料格式使用TLV(Tag Length Value)形式,T代表型別識別符號,L是長度值識別符號,V代表值編碼。數字證書中的每一項都有個對應的型別T。一個數字證書就是一個大的TLV序列,然後V又由多個TLV組合而成。

SM2證書資料和RSA演算法證書一樣,包含證書版本、序列號、頒發者、使用者主體資訊、使用者公鑰、有效期、證書擴充套件項等,只不過SM2證書的公鑰演算法是使用ECC演算法的Oid標識(1.2.840.10045.2.1),然後公鑰引數使用SM2國密演算法的Oid標識(1.2.156.10197.1.301)。

2)簽名演算法

SM2證書配套的簽名演算法是基於SM3的SM2簽名演算法,演算法Oid標識為1.2.156.10197.1.501,另外SM2國密演算法還定義基於SHA_1、SHA_256的簽名,以及使用SM3演算法的RSA的簽名,只不過簽名演算法Oid標識不一樣。

3)簽名資料

SM2的簽名資料由2個BigInteger大陣列成,再使用Der編碼存放簽名資料。證書的簽名資料由根證書私鑰進行簽名,使用根證書公鑰驗證,頂級根證書使用自己的證書公鑰驗證。

二、數字證書的物件識別符號

數字證書的每項都有物件標識Oid,SM2數字證書的主要區別就是公鑰演算法、公鑰引數、簽名演算法標識不一樣,其餘的都是X509裡標準項。數字證書常見得物件標識有如下:

物件識別符號 名稱 OID
rsaEncryption RSA演算法標識 1.2.840.113549.1.1.1
sha1withRSAEncryption SHA1的RSA簽名 1.2.840.113549.1.1.5
ECC ECC演算法標識 1.2.840.10045.2.1
SM2 SM2演算法標識 1.2.156.10197.1.301
SM3WithSM2 SM3的SM2簽名 1.2.156.10197.1.501
sha1withSM2 SHA1的SM2簽名 1.2.156.10197.1.502
sha256withSM2 SHA256的SM2簽名 1.2.156.10197.1.503
sm3withRSAEncryption SM3的RSA簽名 1.2.156.10197.1.504
commonName 主體名 2.5.4.3
emailAddress 郵箱 1.2.840.113549.1.9.1
cRLDistributionPoints CRL分發點 2.5.29.31
extKeyUsage 擴充套件金鑰用法 2.5.29.37
subjectAltName 使用者備用名稱 2.5.29.17
CP 證書策略 2.5.29.32
clientAuth 客戶端認證 1.3.6.1.5.5.7.3.2
三、數字證書的解析

數字證書的解析主要是根據ASN.1語法和物件識別符號來獲取值,然後再是證書的有效期、頒發機構根證書、CRL吊銷狀態和使用目的等驗證。RSA證書是標準演算法大部分平臺都可以解析,而SM2國密演算法證書的解析就不是那麼通用的。在Windows的一些較高版本開啟SM2證書會顯示“驗證信任關係時,系統層上出現了一個錯誤”,這是因為Windows還不支援SM2演算法證書驗證,不能識別SM2簽名的演算法標識,因此需要自行驗證SM2證書的簽名資料,可基於BouncyCastle開源加密庫來實現SM2驗證簽名,詳細參見我的國密演算法SM2證書製作。