電子証明書について その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
« 電子証明書について | トップページ | 先週届いた本、買った本 »
コメント