zoukankan      html  css  js  c++  java
  • OpenSSL 使用拾遗(二)---- X509 证书的 SKID/AKID 字段

    SKID(证书使用者密钥标识符,subject key identifier 的简称)和 AKID(证书颁发机构密钥标识符,authority key identifier 的简称)是 X509 证书中常见的扩展字段。

    下图是一张典型的证书文件(test.der),其中就包含 SKID 和 AKID 字段。

    它们是做什么用的?简言之,这两个字段用于(通过 subject 和 issuer)快速区分证书。

    数字证书使用已经很广泛,理论上多本证书可能具有相同的 subject name,该如何区分这种情况?

    技术控很容易想到,就用公钥来分辨吧,因为每个自然生成的公钥,都是独一无二的。

    但是,问题又来了:普通公钥都是一串又长又难记的二进制字符串,让人来识别比较,是个很费劲的事。

    既然又长又难记,能否找一个简单易记的方法?

    最终,聪明的人说,那就用 subject 公钥的摘要吧。

    因此在证书结构中,增加一个 SKID 字段,其内容就是公钥内容的摘要结果。

    根据摘要(理论上)的唯一性,SKID 段可以唯一确定证书的公钥,从而确定一本证书。

    当然,确定证书的正确性仍是基本前提,所以证书链校验这个动作还是要做的。

    下面用实际操作进行说明

    一、找到公钥在文件中的位置

    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字节的部分)

    二、提取公钥内容 -- 文件中的偏移是从 207 开始,长 141 字节,实际内容(ASN1 结构)需要向后偏移一个 0x00 字节

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

    三、做 SHA1 摘要

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

    与上图中显示的“使用者密钥标识符”相同

    除了 SKID 外,还有 AKID,该字段唯一确定了(颁发当前证书的)证书颁发机构证书(即 CA 证书)的公钥。

    AKID 的值也是证书颁发机构证书的公钥的摘要结果。感兴趣的同学可以验证下。

    此外,由证书链的存在,可以推断,当前证书的 AKID 应该等于证书颁发机构证书的 SKID(如果存在此字段的话)。

  • 相关阅读:
    【字符集及字符编码】UTF-8、UTF-16和UTF-32
    【Android】SQLite基本用法(转)
    【eclipse】导入/导出开发环境(包括编辑器字体颜色大小等)
    一个Android Socket的例子(转)
    Linux中与Windows对应的InterlockedIncrement()函数
    Linux互斥锁pthread_mutex_t
    C++读写文本文件
    C++回调函数调用Java接口抽象函数
    Overlapped I/O模型--事件通知【摘录自《Windows网络编程》】
    Linux C++中需要的头文件
  • 原文地址:https://www.cnblogs.com/efzju/p/4976144.html
Copyright © 2011-2022 走看看