数字证书格式
数字证书格式
该文主要介绍数字证书格式。
数字证书格式
1. 术语1
- 数字证书(digital certificate):由国家认可的,具有权威性,可信性和公正性的第三方证书认证机构(CA)进行数字签名的一个可信的数字化文件。
- 证书撤销列表(certificate revocation list, CRL):CRL 是 CA 对撤销的证书而签发的一个列表文件。
- CA证书(CA certificate):CA 证书指颁发给数字证书认证机构的证书。
- 终端实体证书(entity certificat):终端实体也称为用户证书,是由数字证书认证机构签发的个人证书,机构证书、设备证书等。
2. ASN1
ASN.1
是 ISO
和 ITU-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 位,扩展类型可以使用更多位。
- Class:2 位,用于表示数据类型的类别。有四种类别:
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 Identifier | 2.5.29.35 | 标识颁发者的公钥,用于验证证书链。 |
Subject Key Identifier | 2.5.29.14 | 标识证书中主体的公钥,通常是公钥的哈希值。 |
Key Usage | 2.5.29.15 | 定义公钥的用途,例如签名、加密等。 |
Extended Key Usage | 2.5.29.37 | 指定公钥的其他用途,例如服务器身份验证、客户端身份验证等。 |
Certificate Policies | 2.5.29.32 | 定义证书所遵循的策略。 |
Subject Alternative Name | 2.5.29.17 | 允许一个实体拥有多个名称,例如多个域名或电子邮件地址。 |
CRL Distribution Points | 2.5.29.31 | 指示证书吊销列表(CRL)的分发点。 |
Authority Information Access | 1.3.6.1.5.5.7.1.1 | 提供有关证书颁发者的信息,如 OCSP 位置和 CA 颁发的证书 URL。 |
Subject Information Access | 1.3.6.1.5.5.7.1.11 | 提供有关主体的信息,如时间戳、证书存储库等。 |
4. 证书解析
证书解析:https://github.com/august295/EnDeCode
参考
本文由作者按照 CC BY 4.0 进行授权