OIDとASN.1
- X.509証明書はRFC5280で定義されており、証明書を作成する際に使用するOIDもこの中で定義されています。
- 例えば、拡張キー使用法(EKU)の記載を探すために、RFC5280を”2.5.29.37″で検索しても見つかりません。OIDの定義は後述のようにASN.1という形式で定義されており、単純な番号の羅列では定義されていないためです。
- 拡張キー使用法(EKU: “2.5.29.37”)の定義
- 証明書拡張(id-ce)としてOID: “2.5.29”が定義されています。1234.2.1. Standard Extensions...id-ce OBJECT IDENTIFIER ::= { joint-iso-ccitt(2) ds(5) 29 }
- 拡張キー使用法(id-ce-extKeyUsage)は”{ id-ce 37 }”と定義されています。
前項のid-ceの値を展開すると”2.5.29.37″になります。1234.2.1.12. Extended Key Usage...id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 }
- 証明書拡張(id-ce)としてOID: “2.5.29”が定義されています。
- 拡張キー使用法(EKU)で指定可能なキーの定義
EKUの値として、サーバ認証やクライアント認証等の目的を表現するキーを指定します。
目的キーの値は、例えばサーバ認証であれば”1.3.6.1.5.5.7.3.1″、クライアント認証であれば”1.3.6.1.5.5.7.3.2″を指定します。これらの目的キーは次のように定義されています。- X.509証明書の標準(id-pkix)として、”1.3.6.1.5.5.7″が定義されています。
(PKIXは”the Public-Key Infrastructure using X.509″の意味のようです。)12345A.1. Explicitly Tagged Module, 1988 Syntax...id-pkix OBJECT IDENTIFIER ::={ iso(1) identified-organization(3) dod(6) internet(1)security(5) mechanisms(5) pkix(7) } - 目的キー共通(id-kp)として”{ id-pkix 3 }”が定義されています。前項のid-pkixを展開すると”1.3.6.1.5.5.7.3″となります。
目的キーの一つであるサーバ認証(id-kp-serverAuth)は”{ id-kp 1 }”と定義されています。前述のid-kpを展開すると”1.3.6.1.5.5.7.3.1″となります。
同様に、クライアント認証は”{ id-kp 2 }”と定義されているので、id-kpを展開して”1.3.6.1.5.5.7.3.2″となります。12345678910111213144.2.1.12. Extended Key Usage...id-kp OBJECT IDENTIFIER ::= { id-pkix 3 }id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 }-- TLS WWW server authentication-- Key usage bits that may be consistent: digitalSignature,-- keyEncipherment or keyAgreementid-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 }-- TLS WWW client authentication-- Key usage bits that may be consistent: digitalSignature-- and/or keyAgreement...
- X.509証明書の標準(id-pkix)として、”1.3.6.1.5.5.7″が定義されています。
リンク
証明書のASN.1の確認方法
certutilを使用することで、証明書の内容をASN.1構造で確認できます。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | C:\xxx>certutil -asn -v test.cer 0000: 30 82 03 0c ; SEQUENCE (30c バイト) 0004: 30 82 01 f4 ; SEQUENCE (1f4 バイト) 0008: | a0 03 ; OPTIONAL[0] (3 バイト) 000a: | | 02 01 ; INTEGER (1 バイト) 000c: | | 02 ... 0026: | 30 14 ; SEQUENCE (14 バイト) 0028: | | 31 12 ; SET (12 バイト) 002a: | | 30 10 ; SEQUENCE (10 バイト) 002c: | | 06 03 ; OBJECT_ID (3 バイト) 002e: | | | 55 04 03 | | | ; 2.5.4.3 共通名 (CN) 0031: | | 13 09 ; PRINTABLE_STRING (9 バイト) 0033: | | 6c 6f 63 61 6c 68 6f 73 74 ; localhost | | ; "localhost" ... 0198: | a3 62 ; OPTIONAL[3] (62 バイト) 019a: | 30 60 ; SEQUENCE (60 バイト) 019c: | 30 0c ; SEQUENCE (c バイト) 019e: | | 06 03 ; OBJECT_ID (3 バイト) 01a0: | | | 55 1d 13 | | | ; 2.5.29.19 基本制限 01a3: | | 01 01 ; BOOL (1 バイト) 01a5: | | | ff 01a6: | | 04 02 ; OCTET_STRING (2 バイト) 01a8: | | 30 00 ; SEQUENCE (0 バイト) 01aa: | 30 0e ; SEQUENCE (e バイト) 01ac: | | 06 03 ; OBJECT_ID (3 バイト) 01ae: | | | 55 1d 0f | | | ; 2.5.29.15 キー使用法 01b1: | | 01 01 ; BOOL (1 バイト) 01b3: | | | ff 01b4: | | 04 04 ; OCTET_STRING (4 バイト) 01b6: | | 03 02 ; BIT_STRING (2 バイト) 01b8: | | 05 01b9: | | a0 01ba: | 30 16 ; SEQUENCE (16 バイト) 01bc: | | 06 03 ; OBJECT_ID (3 バイト) 01be: | | | 55 1d 25 | | | ; 2.5.29.37 拡張キー使用法 01c1: | | 01 01 ; BOOL (1 バイト) 01c3: | | | ff 01c4: | | 04 0c ; OCTET_STRING (c バイト) 01c6: | | 30 0a ; SEQUENCE (a バイト) 01c8: | | 06 08 ; OBJECT_ID (8 バイト) 01ca: | | 2b 06 01 05 05 07 03 01 | | ; 1.3.6.1.5.5.7.3.1 サーバー認証 01d2: | 30 17 ; SEQUENCE (17 バイト) 01d4: | | 06 03 ; OBJECT_ID (3 バイト) 01d6: | | | 55 1d 11 | | | ; 2.5.29.17 サブジェクト代替名 01d9: | | 01 01 ; BOOL (1 バイト) 01db: | | | ff 01dc: | | 04 0d ; OCTET_STRING (d バイト) 01de: | | 30 0b ; SEQUENCE (b バイト) 01e0: | | 82 09 ; CONTEXT_SPECIFIC[2] (9 バイト) 01e2: | | 6c 6f 63 61 6c 68 6f 73 74 ; localhost 01eb: | 30 0f ; SEQUENCE (f バイト) 01ed: | 06 0a ; OBJECT_ID (a バイト) 01ef: | | 2b 06 01 04 01 82 37 54 01 01 | | ; 1.3.6.1.4.1.311.84.1.1 01f9: | 04 01 ; OCTET_STRING (1 バイト) 01fb: | 02 ; . ... CertUtil: -asn コマンドは正常に完了しました。 |