2024年10月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

 

« 電子証明書について | トップページ | 先週届いた本、買った本 »

2018年7月 1日 (日)

電子証明書について その2

PKCS12ファイルの中に入れてある公開鍵証明書の情報は、X.509という規格に従っている。

RFC5280「Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile」で公開されている。(IPAにある日本語版は、データ型の所とか削ってあるので、併用して英語版を見ると良い)
X.509 は、以下のようになっている。
  • ASN.1という規格で記述されている。
  • TLV形式(タグ・長さ・データ)という形
  • タグは、1バイト。先頭2bitはclass、次の1bitはprimitive/constructedフラグ(p/c)、残り5bitはtag。
    ・class=00BはASN.1で定義されているデータ型。
    class=10Bは文脈依存。例えば、versionの所で使われている。1バイト目0xA0は、X.509v3証明書で示されている"version [0] Version DEFAULT v1."のところ、”class=80 p/c=20 tagid=00”がそれ。tag=0x00なのは"[0]"を示している。他には、"extensions [3]"のところ。0xA3→”class=80 p/c=20 tagid=03”となっている。
    ・primitive/constructedは、1のとき後者で構造体となっていると思えばOK。
    ・tagは、class=0x00、p/c=0x00ならASN.1で決められたデータ型になる。
  • 長さは、1バイト目が0x80より小の場合、データ長0~127バイトを示す。
    0x80より大の場合、7bitでそのあとのバイト数がデータ長を示す。例えば0x82,0x01,0x02としたら0x01*0x100+0x02=データ長258バイトとなる。0x80のときはあまりないと思われるけど、末尾0x00までがデータとなる。
  • データは、長さで示されたバイト数。
    特別なデータ型として、T=0x30や0x31のとき、Vの中が次の構造体のデータを示す。

class=00 p/c=20 tagid=10 len=1142 i=4
  class=00 p/c=20 tagid=10 len=862 i=8
    class=80 p/c=20 tagid=00 len=3 i=10
      class=00 p/c=00 tagid=02 len=1 i=13        *version=3 (値+1で扱う)
      2
    class=00 p/c=00 tagid=02 len=9 i=24        *serialNumber=0x99674fbc78d5f74b
    1.10538914813039E+19
    class=00 p/c=20 tagid=10 len=13 i=26
      class=00 p/c=00 tagid=06 len=9 i=37      *AlgrithmIdentifer OIDはsha256WithRSAEncryption
      1.2.840.113549.1.1.11
      class=00 p/c=00 tagid=05 len=0 i=39
    class=00 p/c=20 tagid=10 len=207 i=42      *発行者(Issuer)
      class=00 p/c=20 tagid=11 len=11 i=44
        class=00 p/c=20 tagid=10 len=9 i=46
          class=00 p/c=00 tagid=06 len=3 i=51  *countryName=JP
          2.5.4.6
          class=00 p/c=00 tagid=13 len=2 i=55
          4a 50
      class=00 p/c=20 tagid=11 len=16 i=57
        class=00 p/c=20 tagid=10 len=14 i=59
          class=00 p/c=00 tagid=06 len=3 i=64  *stateOrProvinceName(ST)=TOKYO
          2.5.4.8
          class=00 p/c=00 tagid=0c len=7 i=73
          53 41 49 54 41 4d 41
      class=00 p/c=20 tagid=11 len=17 i=75
        class=00 p/c=20 tagid=10 len=15 i=77
          class=00 p/c=00 tagid=06 len=3 i=82  *localityName(L)=MINATOKU
          2.5.4.7
          class=00 p/c=00 tagid=0c len=8 i=92
          4b 4f 53 49 47 41 59 41
      class=00 p/c=20 tagid=11 len=16 i=94
        class=00 p/c=20 tagid=10 len=14 i=96
          class=00 p/c=00 tagid=06 len=3 i=101  *organizationName(O)=COMPANY
          2.5.4.10
          class=00 p/c=00 tagid=0c len=7 i=110
          43 4f 4d 50 41 4e 59
      class=00 p/c=20 tagid=11 len=17 i=112
        class=00 p/c=20 tagid=10 len=15 i=114    *organizationalUnitName(OU)=JIGYOUBU
          class=00 p/c=00 tagid=06 len=3 i=119
          2.5.4.11
          class=00 p/c=00 tagid=0c len=8 i=129
          4a 49 47 59 4f 55 42 55
      class=00 p/c=20 tagid=11 len=11 i=131
        class=00 p/c=20 tagid=10 len=9 i=133
          class=00 p/c=00 tagid=06 len=3 i=138  *commonName(CN)=BU
          2.5.4.3
          class=00 p/c=00 tagid=0c len=2 i=142
          42 55
      class=00 p/c=20 tagid=11 len=15 i=144
        class=00 p/c=20 tagid=10 len=13 i=146
          class=00 p/c=00 tagid=06 len=3 i=151  *title=title1
          2.5.4.12
          class=00 p/c=00 tagid=0c len=6 i=159
          74 69 74 6c 65 31
      class=00 p/c=20 tagid=11 len=17 i=161
        class=00 p/c=20 tagid=10 len=15 i=163
          class=00 p/c=00 tagid=06 len=3 i=168  *surname(SN)=surname1
          2.5.4.4
          class=00 p/c=00 tagid=0c len=8 i=178
          73 75 72 6e 61 6d 65 31
      class=00 p/c=20 tagid=11 len=19 i=180
        class=00 p/c=20 tagid=10 len=17 i=182
          class=00 p/c=00 tagid=06 len=3 i=187  *givenName(GN)=givenname1
          2.5.4.42
          class=00 p/c=00 tagid=0c len=10 i=199
          67 69 76 65 6e 6e 61 6d 65 31
      class=00 p/c=20 tagid=11 len=17 i=201
        class=00 p/c=20 tagid=10 len=15 i=203
          class=00 p/c=00 tagid=06 len=3 i=208  *initials=initial1
          2.5.4.43
          class=00 p/c=00 tagid=0c len=8 i=218
          69 6e 69 74 69 61 6c 31
      class=00 p/c=20 tagid=11 len=29 i=220
        class=00 p/c=20 tagid=10 len=27 i=222
          class=00 p/c=00 tagid=06 len=9 i=233  *emailAddress=test1@test.com
          1.2.840.113549.1.9.1
          class=00 p/c=00 tagid=16 len=14 i=249
          74 65 73 74 31 40 74 65 73 74 2e 63 6f 6d
    class=00 p/c=20 tagid=10 len=30 i=251      *vallidity
      class=00 p/c=00 tagid=17 len=13 i=266    *notBefore=180701064133Z UTCTime->2018/07/01 06:41:33
      31 38 30 37 30 31 30 36 34 31 33 33 5a
      class=00 p/c=00 tagid=17 len=13 i=281    *notAfter =280628064133Z UTCTime->2028/06/28 06:41:33
      32 38 30 36 32 38 30 36 34 31 33 33 5a
    class=00 p/c=20 tagid=10 len=207 i=284
      class=00 p/c=20 tagid=11 len=11 i=286      *Issuer (内容はSubjectと同じ)
        class=00 p/c=20 tagid=10 len=9 i=288
          class=00 p/c=00 tagid=06 len=3 i=293
          2.5.4.6
          class=00 p/c=00 tagid=13 len=2 i=297
          4a 50
      class=00 p/c=20 tagid=11 len=16 i=299
        class=00 p/c=20 tagid=10 len=14 i=301
          class=00 p/c=00 tagid=06 len=3 i=306
          2.5.4.8
          class=00 p/c=00 tagid=0c len=7 i=315
          53 41 49 54 41 4d 41
      class=00 p/c=20 tagid=11 len=17 i=317
        class=00 p/c=20 tagid=10 len=15 i=319
          class=00 p/c=00 tagid=06 len=3 i=324
          2.5.4.7
          class=00 p/c=00 tagid=0c len=8 i=334
          4b 4f 53 49 47 41 59 41
      class=00 p/c=20 tagid=11 len=16 i=336
        class=00 p/c=20 tagid=10 len=14 i=338
          class=00 p/c=00 tagid=06 len=3 i=343
          2.5.4.10
          class=00 p/c=00 tagid=0c len=7 i=352
          43 4f 4d 50 41 4e 59
      class=00 p/c=20 tagid=11 len=17 i=354
        class=00 p/c=20 tagid=10 len=15 i=356
          class=00 p/c=00 tagid=06 len=3 i=361
          2.5.4.11
          class=00 p/c=00 tagid=0c len=8 i=371
          4a 49 47 59 4f 55 42 55
      class=00 p/c=20 tagid=11 len=11 i=373
        class=00 p/c=20 tagid=10 len=9 i=375
          class=00 p/c=00 tagid=06 len=3 i=380
          2.5.4.3
          class=00 p/c=00 tagid=0c len=2 i=384
          42 55
      class=00 p/c=20 tagid=11 len=15 i=386
        class=00 p/c=20 tagid=10 len=13 i=388
          class=00 p/c=00 tagid=06 len=3 i=393
          2.5.4.12
          class=00 p/c=00 tagid=0c len=6 i=401
          74 69 74 6c 65 31
      class=00 p/c=20 tagid=11 len=17 i=403
        class=00 p/c=20 tagid=10 len=15 i=405
          class=00 p/c=00 tagid=06 len=3 i=410
          2.5.4.4
          class=00 p/c=00 tagid=0c len=8 i=420
          73 75 72 6e 61 6d 65 31
      class=00 p/c=20 tagid=11 len=19 i=422
        class=00 p/c=20 tagid=10 len=17 i=424
          class=00 p/c=00 tagid=06 len=3 i=429
          2.5.4.42
          class=00 p/c=00 tagid=0c len=10 i=441
          67 69 76 65 6e 6e 61 6d 65 31
      class=00 p/c=20 tagid=11 len=17 i=443
        class=00 p/c=20 tagid=10 len=15 i=445
          class=00 p/c=00 tagid=06 len=3 i=450
          2.5.4.43
          class=00 p/c=00 tagid=0c len=8 i=460
          69 6e 69 74 69 61 6c 31
      class=00 p/c=20 tagid=11 len=29 i=462
        class=00 p/c=20 tagid=10 len=27 i=464
          class=00 p/c=00 tagid=06 len=9 i=475
          1.2.840.113549.1.9.1
          class=00 p/c=00 tagid=16 len=14 i=491
          74 65 73 74 31 40 74 65 73 74 2e 63 6f 6d
  class=00 p/c=20 tagid=10 len=290 i=495          *SubjectPublicKeyInfo
    class=00 p/c=20 tagid=10 len=13 i=497
      class=00 p/c=00 tagid=06 len=9 i=508      *algorithm=RSA encryption
      1.2.840.113549.1.1.1
      class=00 p/c=00 tagid=05 len=0 i=510
    class=00 p/c=00 tagid=03 len=271 i=785        *subjecPublicKey
    00 30 82 01 0a 02 82 01 01 00 da 7e c9 0b f6 60 ff c0 42 b1 7c 2a 59 0f 5a 89 4a f7 50 52 20 35 c4 20 8a e9 c0 b5 22 d9 e0 f0 e3 a0 01 bc 6e 74 a0 88 b1 55 b3 b5 a5 e9 94 21 28 dc 20 fe 1f 8f 66 a4 25 10 83 a5 4e 53 25 2c 80 b4 d2 7f 01 b7 fa 17 ec 83 84 d3 84 5e 05 81 ac fa a9 c7 27 19 72 ec ba 66 7e 0b 33 63 e3 b0 c8 77 88 b9 21 e3 48 6c df 89 55 1d 7f 9b e9 73 4f da 78 0c d1 25 88 d3 18 24 57 9c 73 0e 22 e6 da 53 f9 33 42 bc 9c e4 59 80 81 3c 7f 27 3f d7 5b 52 95 db 94 5d b7 33 b4 56 d6 ea 53 bd 74 82 92 51 dc bb 68 64 74 8c 52 91 75 39 a2 5f dd 77 0b c5 79 59 28 09 5f 87 eb d6 0c bc fe 16 e7 55 b4 38 a6 45 f5 9f aa 06 95 6c 90 e3 16 38 96 b6 ad 0e bf 55 39 1b 65 12 78 91 15 fb 90 93 a8 26 74 67 4a 77 f2 fe e5 37 d1 4c a1 8d a7 6d 98 56 9e 9b c8 74 7f 62 fb a2 f6 1d ff 97 ca 58 69 91 02 03 01 00 01
    class=80 p/c=20 tagid=03 len=83 i=870        *Extensions
    30 51 30 1d 06 03 55 1d 0e 04 16 04 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16 30 1f 06 03 55 1d 23 04 18 30 16 80 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16 30 0f 06 03 55 1d 13 01 01 ff 04 05 30 03 01 01 ff
    class=00 p/c=20 tagid=10 len=13 i=872
      class=00 p/c=00 tagid=06 len=9 i=883      *signatureAlgrithm=sha256WithRSAEncryption
      1.2.840.113549.1.1.11
      class=00 p/c=00 tagid=05 len=0 i=885
  class=00 p/c=00 tagid=03 len=257 i=1146          *signature
  00 22 87 e4 5e 43 31 4f 4b ea 51 ee dc d5 a9 0d c3 85 df d5 b9 80 f5 6f a1 b4 0a e7 8e 8c c5 0c 2d be ad c7 50 ab df 38 1e ae 73 7a 33 b9 48 02 d8 9d 98 57 a7 ed 09 15 ff 22 fe 4c ee a0 54 6e 34 b6 2f ca 1c 19 03 97 8f 67 72 3a 81 ae 8a dd fe 67 2e b8 2e 48 04 ad ce a6 a0 69 3a e7 67 b1 79 4a cd 33 91 1e 98 30 56 f0 14 4c 5a dd 97 b8 7a 98 7a dc 31 60 fd e6 bd a0 6b 5e 6f 9e 5b b9 3f b9 81 f1 89 15 b5 60 e4 40 40 f7 10 90 d9 46 68 44 3b ac 6d 55 0b 52 50 01 d5 71 0b 3e 9e 3c 35 06 f5 e1 f0 12 97 c5 41 45 9c 5b 7c a0 9f e4 64 36 8d 25 c5 11 7a d3 f7 8b ee 6b 00 c5 3f dd 60 78 ae 20 d6 48 44 44 a5 35 cc d9 73 d1 ee c7 80 f3 7b 91 49 f8 65 a5 ab 93 a9 fc ec b1 cf eb fb 5f 88 47 e3 64 c6 e4 69 c4 f2 96 67 bb 28 ec 28 e2 ad f5 89 3a 3b 31 63 95 d5 5e df 4b 2d c9 95

●Extensionsの部分を切り出して、構造を見てみる。

class=00 p/c=20 tagid=10 len=81 i=2
  class=00 p/c=20 tagid=10 len=29 i=4
    class=00 p/c=00 tagid=06 len=3 i=9        *Subject Key Identifier
    2.5.29.14
    class=00 p/c=00 tagid=04 len=22 i=33
    04 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16
  class=00 p/c=20 tagid=10 len=31 i=35
    class=00 p/c=00 tagid=06 len=3 i=40        *Authority Key Identifier
    2.5.29.35
    class=00 p/c=00 tagid=04 len=24 i=66
    30 16 80 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16
  class=00 p/c=20 tagid=10 len=15 i=68
    class=00 p/c=00 tagid=06 len=3 i=73        *Basic Constraints
    2.5.29.19
    class=00 p/c=00 tagid=01 len=1 i=76
    ff
class=00 p/c=00 tagid=04 len=5 i=83
30 03 01 01 ff

●Extensionsを切り出して関数に食わせた手順。dispASN1は前もって定義している

PS D:\cert> $r=New-Object regex("[0-9a-fA-F]{2}"); $tmp=@();
PS D:\cert> "30 51 30 1d 06 03 55 1d 0e 04 16 04 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16 30 1f 06
 03 55 1d 23 04 18 30 16 80 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16 30 0f 06 03 55 1d 13 01 01 ff
 04 05 30 03 01 01 ff" | %{$r.Matches($_)} | %{$tmp += [Convert]::ToByte("0x" + $_.Value, 16)}
PS D:\cert> dispASN1 $tmp
dispASN1 start
class=00 p/c=20 tagid=10 len=81 i=2
class=00 p/c=20 tagid=10 len=29 i=4
class=00 p/c=00 tagid=06 len=3 i=9
2.5.29.14
class=00 p/c=00 tagid=04 len=22 i=33
04 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16
class=00 p/c=20 tagid=10 len=31 i=35
class=00 p/c=00 tagid=06 len=3 i=40
2.5.29.35
class=00 p/c=00 tagid=04 len=24 i=66
30 16 80 14 fd 36 ca 12 16 ec c9 62 b9 15 33 d3 a3 a8 11 10 2b 43 5c 16
class=00 p/c=20 tagid=10 len=15 i=68
class=00 p/c=00 tagid=06 len=3 i=73
2.5.29.19
class=00 p/c=00 tagid=01 len=1 i=76
ff
class=00 p/c=00 tagid=04 len=5 i=83
30 03 01 01 ff
dispASN1 end

« 電子証明書について | トップページ | 先週届いた本、買った本 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 電子証明書について その2:

« 電子証明書について | トップページ | 先週届いた本、買った本 »