文章

数字证书格式

数字证书格式

该文主要介绍数字证书格式。

数字证书格式

1. 术语1

  • 数字证书(digital certificate):由国家认可的,具有权威性,可信性和公正性的第三方证书认证机构(CA)进行数字签名的一个可信的数字化文件。
  • 证书撤销列表(certificate revocation list, CRL):CRL 是 CA 对撤销的证书而签发的一个列表文件。
  • CA证书(CA certificate):CA 证书指颁发给数字证书认证机构的证书。
  • 终端实体证书(entity certificat):终端实体也称为用户证书,是由数字证书认证机构签发的个人证书,机构证书、设备证书等。

2. ASN1

ASN.1ISOITU-T 的联合标准,最初是 1984 年的 CCITT X.409:1984 的一部分。由于其广泛应用,1988 年 ASN.1 移到独立标准 X.208,1995 年进行全面修订后变成 X.680 系列标准。

ASN.1 本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。各种 ASN.1 的编码规则提供了由 ASN.1 描述其抽象句法的数据的值的传送语法(具体表达)。标准的 ASN.1 编码规则有:

  • 基本编码规则(BER,Basic Encoding Rules)
  • 规范编码规则(CER,Canonical Encoding Rules)
  • 唯一编码规则(DER,Distinguished Encoding Rules)
  • 压缩编码规则(PER,Packed Encoding Rules)
  • XML编码规则(XER,XML Encoding Rules)

2.1. TLV编码

TLV (Tag-Length-Value)

2.1.1. Tag (标签)

  • 目的:标识数据类型。
  • 格式:通常为一个字节或多个字节。
  • 结构
    • Class:2 位,用于表示数据类型的类别。有四种类别:
      • 00: Universal (通用类型)
      • 01: Application (应用类型)
      • 10: Context-specific (上下文特定类型)
      • 11: Private (私有类型)
    • PC (Primitive/Constructed):1 位,表示数据是原始类型还是构造类型。
      • 0: Primitive (原始类型)
      • 1: Constructed (构造类型)
    • Tag Number:5 位或更多位,用于表示具体的数据类型。标准类型为 5 位,扩展类型可以使用更多位。

2.1.2. Length (长度)

  • 目的:表示数据值部分的长度。
  • 格式:一个字节或多个字节。
  • 结构
    • 如果第一个字节的最高位为 0,表示短格式,用 7 位表示长度(0-127)。
    • 如果第一个字节的最高位为 1,表示长格式,低 7 位表示后续字节数。后续字节表示的值为数据值的实际长度。即 0x81 表示 1 字节,0x82 表示 2 字节,0x83 表示 3 字节,0x84 表示 4 字节

2.1.3. Value (值)

  • 目的:存储实际的数据。
  • 格式:任意长度,由 Length 字段定义。
  • 结构:具体的数据,根据 Tag 字段定义的类型进行编码。

2.2. Tag类型

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
/* ASN.1 tag values */
#define V_ASN1_EOC               0
#define V_ASN1_BOOLEAN           1
#define V_ASN1_INTEGER           2
#define V_ASN1_BIT_STRING        3
#define V_ASN1_OCTET_STRING      4
#define V_ASN1_NULL              5
#define V_ASN1_OBJECT            6
#define V_ASN1_OBJECT_DESCRIPTOR 7
#define V_ASN1_EXTERNAL          8
#define V_ASN1_REAL              9
#define V_ASN1_ENUMERATED        10
#define V_ASN1_UTF8STRING        12
#define V_ASN1_SEQUENCE          16
#define V_ASN1_SET               17
#define V_ASN1_NUMERICSTRING     18
#define V_ASN1_PRINTABLESTRING   19 /* printable subset of ascii */
#define V_ASN1_T61STRING         20
#define V_ASN1_TELETEXSTRING     20 /* alias */
#define V_ASN1_VIDEOTEXSTRING    21
#define V_ASN1_IA5STRING         22 /* 7-bit ascii */
#define V_ASN1_UTCTIME           23
#define V_ASN1_GENERALIZEDTIME   24
#define V_ASN1_GRAPHICSTRING     25
#define V_ASN1_ISO64STRING       26
#define V_ASN1_VISIBLESTRING     26 /* alias */
#define V_ASN1_GENERALSTRING     27
#define V_ASN1_UNIVERSALSTRING   28
#define V_ASN1_BMPSTRING         30 /* 2-byte unicode with zeros */

3. X509

X.509 是密码学里公钥证书的格式标准。X.509 证书已应用在包括 TLS/SSL 在内的众多网络协议里,同时它也用在很多非在线应用场景里,比如电子签名服务。

3.1. 证书组成结构

证书组成结构标准用 ASN.1(一种标准的语言)来进行描述,X.509 v3 数字证书结构如下:

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
Certificate ::= SEQUENCE {
  tbsCertificate        TBSCertificate,
  signatureAlgorithm    AlgorithmIdentifier,
  signatureValue        BIT STRING
}

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,
  subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
  extensions      [3] EXPLICIT Extensions OPTIONAL
}

Version ::= INTEGER { v1(0), v2(1), v3(2) }

CertificateSerialNumber ::= INTEGER

AlgorithmIdentifier ::= SEQUENCE {
  algorithm               OBJECT IDENTIFIER,
  parameters              ANY DEFINED BY algorithm OPTIONAL
}

Name ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET OF AttributeTypeAndValue

AttributeTypeAndValue ::= SEQUENCE {
  type            OBJECT IDENTIFIER,
  value           ANY DEFINED BY type
}

Validity ::= SEQUENCE {
  notBefore       Time,
  notAfter        Time
}

Time ::= CHOICE {
  utcTime         UTCTime,
  generalizedTime GeneralizedTime
}

SubjectPublicKeyInfo ::= SEQUENCE {
  algorithm       AlgorithmIdentifier,
  subjectPublicKey BIT STRING
}

UniqueIdentifier ::= BIT STRING

Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension

Extension ::= SEQUENCE {
  extnID          OBJECT IDENTIFIER,
  critical        BOOLEAN DEFAULT FALSE,
  extnValue       OCTET STRING
}

其中颁发者唯一ID和主体唯一ID在遵循国密时不应生成。

3.2. TBSCertificate

字段名称描述
Version证书版本,X.509 v1、v2 或 v3
Serial Number证书的唯一标识符
Signature Algorithm签名算法标识符
Issuer颁发者的名称
Validity证书的有效期,包括 NotBefore 和 NotAfter
Subject证书持有者的名称
Subject Public Key Info证书持有者的公钥信息
Issuer Unique Identifier颁发者唯一标识符(可选)
Subject Unique Identifier主体唯一标识符(可选)
Extensions扩展字段(可选)

3.2.1. 扩展信息

扩展信息(Extensions)是 X.509 v3 证书中的一个重要部分,用于提供额外的信息和功能。这些扩展信息允许证书包含更多的信息,使其更适用于特定的应用场景。每个扩展信息字段由三个部分组成:扩展标识符(extnID)、是否关键(critical)、和扩展值(extnValue)。

名称类型描述
extnID (扩展标识符)OBJECT IDENTIFIER唯一标识扩展类型的对象标识符(OID)。
critical (是否关键)BOOLEAN指示该扩展是否关键。如果是关键扩展(值为 TRUE),表示如果接收方无法识别或处理该扩展,则证书应被视为无效。默认为 FALSE。
extnValue (扩展值)OCTET STRING包含扩展的实际内容,根据 extnID 的不同而不同。
3.2.1.1. 常见的扩展类型
扩展类型OID描述
Authority Key Identifier2.5.29.35标识颁发者的公钥,用于验证证书链。
Subject Key Identifier2.5.29.14标识证书中主体的公钥,通常是公钥的哈希值。
Key Usage2.5.29.15定义公钥的用途,例如签名、加密等。
Extended Key Usage2.5.29.37指定公钥的其他用途,例如服务器身份验证、客户端身份验证等。
Certificate Policies2.5.29.32定义证书所遵循的策略。
Subject Alternative Name2.5.29.17允许一个实体拥有多个名称,例如多个域名或电子邮件地址。
CRL Distribution Points2.5.29.31指示证书吊销列表(CRL)的分发点。
Authority Information Access1.3.6.1.5.5.7.1.1提供有关证书颁发者的信息,如 OCSP 位置和 CA 颁发的证书 URL。
Subject Information Access1.3.6.1.5.5.7.1.11提供有关主体的信息,如时间戳、证书存储库等。

4. 证书解析

证书解析:https://github.com/august295/EnDeCode

参考

本文由作者按照 CC BY 4.0 进行授权