X.509証明書仕様(RFC5280)でのOIDの読み方

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 }
  • 拡張キー使用法(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
      ...

証明書の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 コマンドは正常に完了しました。