OpenSSL 使用拾遺(二)---- X509 證書的 SKID/AKID 字段

SKID(證書使用者密鑰標識符,subject key identifier 的簡稱)和 AKID(證書頒發機構密鑰標識符,authority key identifier 的簡稱)是 X509 證書中常見的擴展字段。ide

下圖是一張典型的證書文件(test.der),其中就包含 SKID 和 AKID 字段。spa

它們是作什麼用的?簡言之,這兩個字段用於(經過 subject 和 issuer)快速區分證書。3d

數字證書使用已經很普遍,理論上多本證書可能具備相同的 subject name,該如何區分這種狀況?code

技術控很容易想到,就用公鑰來分辨吧,由於每一個天然生成的公鑰,都是獨一無二的。orm

可是,問題又來了:普通公鑰都是一串又長又難記的二進制字符串,讓人來識別比較,是個很費勁的事。blog

既然又長又難記,可否找一個簡單易記的方法?ip

最終,聰明的人說,那就用 subject 公鑰的摘要吧。ssl

所以在證書結構中,增長一個 SKID 字段,其內容就是公鑰內容的摘要結果。字符串

根據摘要(理論上)的惟一性,SKID 段能夠惟一肯定證書的公鑰,從而肯定一本證書。openssl

固然,肯定證書的正確性還是基本前提,因此證書鏈校驗這個動做仍是要作的。

 

下面用實際操做進行說明

1、找到公鑰在文件中的位置

D:\>openssl asn1parse -in test.der -inform der -dump -i
  ......
  186:d=2  hl=3 l= 159 cons:   SEQUENCE
  189:d=3  hl=2 l=  13 cons:    SEQUENCE
  191:d=4  hl=2 l=   9 prim:     OBJECT            :rsaEncryption
  202:d=4  hl=2 l=   0 prim:     NULL
  204:d=3  hl=3 l= 141 prim:    BIT STRING -- 偏移從 204 + hl = 207 開始
      0000 - 00 30 81 89 02 81 81 00-c1 af 95 f6 ae d0 21 7b   .0............!{
      0010 - 31 f3 93 68 18 ac 8f e6-53 83 99 cd 80 3d 9a d2   1..h....S....=..
      0020 - 9b 6a fa 08 1b 8b b7 1b-90 5e a1 82 18 c1 3f b0   .j.......^....?.
      0030 - 3f f2 3b 06 5b be e4 7a-b7 c2 36 9e 22 36 1e 60   ?.;.[..z..6."6.`
      0040 - b8 04 b7 f8 9e 25 e7 e3-f0 91 b2 7e 24 c4 c8 41   .....%.....~$..A
      0050 - 27 58 e6 0d 73 d6 f2 4d-12 bc 1b 77 4d 1f ca f1   'X..s..M...wM...
      0060 - 73 99 f3 8f 44 a0 fa 8f-e1 e9 99 e1 b0 ea 6d e1   s...D.........m.
      0070 - db 4d 27 45 40 c9 23 c1-c7 5e 27 ef e8 54 6c c2   .M'E@.#..^'..Tl.
      0080 - cd 02 41 91 bd 1c be fb-02 03 01 00 01            ..A..........
  ......
  409:d=4  hl=2 l=  29 cons:     SEQUENCE
  411:d=5  hl=2 l=   3 prim:      OBJECT            :X509v3 Subject Key Identifier
  416:d=5  hl=2 l=  22 prim:      OCTET STRING -- TLV 格式,藍色部分是 SKID 的 Vlaue
      0000 - 04 14 53 bb 46 ae de 70-07 86 22 dd 7f 5c e2 49   ..S.F..p.."..\.I
      0010 - 1d 65 b8 f7 36 13                                 .e..6.

 下圖是更爲詳細的說明(圖中黃色背景中去掉第一個0x00字節的部分)

2、提取公鑰內容 -- 文件中的偏移是從 207 開始,長 141 字節,實際內容(ASN1 結構)須要向後偏移一個 0x00 字節

D:\>dd if=test.der bs=1 count=140 skip=208 of=skid iflag=binary oflag=binary

 

3、作 SHA1 摘要

D:\>openssl dgst -sha1 skid
SHA1(skid)= 53bb46aede70078622dd7f5ce2491d65b8f73613

與上圖中顯示的「使用者密鑰標識符」相同

 

除了 SKID 外,還有 AKID,該字段惟一肯定了(頒發當前證書的)證書頒發機構證書(即 CA 證書)的公鑰。

AKID 的值也是證書頒發機構證書的公鑰的摘要結果。感興趣的同窗能夠驗證下。

此外,由證書鏈的存在,能夠推斷,當前證書的 AKID 應該等於證書頒發機構證書的 SKID(若是存在此字段的話)。

相關文章
相關標籤/搜索