PKI

電子証明書の定義であるRFC5280を読んでみる(ASN1)その①

電子証明書の内容は、RFC5280(RFC2459、RFC3280の後継)で定義されています。また、その定義については、ASN1と言われる表記方法で記載されています。
ASN1を調べてみると色々と難しい構文が出てくるので何か面倒…。取り合えず電子証明書の内容が読めればよい!ということでRFC5280の読み方をまとめました。
RFC5280の4.1「基本証明書フィールド」を少しづつ読んでいきたいと思います。
公開鍵証明書.png
------------------------------------------
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
------------------------------------------
"::="は右に記載された内容で、左の型が定義されるという意味
なので、Certificate(証明書)はSEQUENCE {}で定義されますよという意味となります。
SEQUENCEは複数の型が順番に並んでいることを指すため、Certificate構造の中身は、tbsCertificate、signatureAlgorithm、signatureValueの順ですよ、ということ。
今日はCertificateの構成要素の一つである、TBSCertificateについて読んでいきます。
------------------------------------------
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, …①
serialNumber CertificateSerialNumber, …②
signature AlgorithmIdentifier, …③
issuer Name, …④
validity Validity, …⑤
subject Name, …⑥
subjectPublicKeyInfo SubjectPublicKeyInfo, …⑦
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 …⑧
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 …⑨
extensions [3] EXPLICIT Extensions OPTIONAL -- If present, version MUST be v3 } …⑩
------------------------------------------
まず、先ほどと同様に、::= SEQUENCE{}で記載された内容が、TBSCertificateですよと言っている。
以降は上記の①~⑩の意味について順に追っていきます。
①version
------------------------------------------
Version ::= INTEGER { v1(0), v2(1), v3(2) }
------------------------------------------
INTEGERは整数を表し、{}内の0、1、2のいずれかである必要があります。電子証明書は、v1証明書(単に証明書)、v2証明書、v3証明書があり、使用している証明書のバージョンが何であるかを示す数字。なお、v1の値である0はデフォルト値であるため、v1の場合はバージョンを記載しなくてもよいとされています。
ちなみにここで使われている[0]はタグタイプと呼ばれるもので、エンコードする際に使用される識別子です。
全部で4種類(UNIVERSAL,APPLICATION,PRIVATE,CONTEXT-SPECIFIC)あります。
②serialNumber
------------------------------------------
CertificateSerialNumber ::= INTEGER
------------------------------------------
各CA毎に電子証明書に一意に付与する番号。そのため、発行者名と合わせて用いることで電子証明書を一意に特定することが可能となります。正の値と決められていますが、本ポリシーに準拠していないCAが存在することも想定して電子証明書の利用者はシステム開発を行う必要があります。INTEGERなので整数です。
③signature
CAが証明書へ署名する際に用いる署名アルゴリズム。
④issuer
証明書に署名し、発行する主体(CA)。issuerはさらにASN.1 構造体で内容が定義されています。
(次回取り上げようと思います。)
⑤validity
------------------------------------------
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time }
------------------------------------------
証明書の有効期間。notBefore Timeは「有効開始時」、notAfter Timeは「有効終了時」
そのため、証明書の有効期間はnotBefore TimeからnotAfter Timeまでとなります。開始から終了まで。
さらに、Timeの定義は以下のとおりです。
------------------------------------------
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }
------------------------------------------
2049年まではUTCTime、2050年以降はGeneralizedTimeを使用することが決められています。
⑥subject
公開鍵証明書の所有者(サブジェクト)。利用者の名前ですね。
⑦subjectPublicKeyInfo
所有者の公開鍵情報。暗号のアルゴリズム(RSA, DSA, or Diffie-Hellman等)を示す識別子と鍵情報が格納されます。
------------------------------------------
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm      AlgorithmIdentifier,
subjectPublicKey   BIT STRING }
------------------------------------------
⑧issuerUniqueID
発行者ID。v2及びv3の証明書である場合には必須。(v1ではあってはいけない)
⑨subjectUniqueID
所有者ID。 v2及びv3の証明書である場合には必須。(v1ではあってはいけない)
⑩extensions
v3で利用される証明書の拡張領域
v3であれば記載されなければなりません。(こちらについてはまた別途。)
------------------------------------------
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID   OBJECT IDENTIFIER,
critical  BOOLEAN DEFAULT FALSE,
extnValue  OCTET STRING
-- contains the DER encoding of an ASN.1 value
-- corresponding to the extension type identified
-- by extnID }
------------------------------------------
結構ボリュームがあるので少しづつまとめていければと思います。

-PKI
-, ,