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”が定義されています。
4.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″になります。4.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″の意味のようです。)A.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″となります。4.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 keyAgreement id-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構造で確認できます。
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 コマンドは正常に完了しました。