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(如果存在此字段的话)。

  • 相关阅读:
    'Undefined symbols for architecture i386,clang: error: linker command failed with exit code 1
    The codesign tool requires there only be one 解决办法
    XCode iOS project only shows “My Mac 64bit” but not simulator or device
    Provisioning profile XXXX can't be found 的解决办法
    UIView 中的控件事件穿透 Passthrough 的实现
    Xcode4.5出现时的OC新语法
    xcode 快捷键(持续更新)
    打越狱包
    php缓存与加速分析与汇总
    浏览器的判断
  • 原文地址:https://www.cnblogs.com/efzju/p/4976144.html
Copyright © 2011-2022 走看看