RFC 5280 X.509 证书与 CRL 详细规范:PKI 信任链的底层协议
概述
X.509 是 ITU-T 和国际互联网工程任务组(IETF)共同维护的数字证书标准家族,其中最核心的规范是 RFC 5280《Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile》。该文档定义了 X.509 v3 证书的完整数据结构和证书吊销列表(CRL)的格式规范,是理解 PKI 体系所有上层协议(TLS、S/MIME、代码签名等)的基础。
RFC 5280 发布于 2008 年 4 月,是对早期 RFC 3280 的全面修订。它并非独立标准,而是建立在两个基础标准之上:
- ITU-T X.509(2001 年版):定义证书和 CRL 的抽象语法(ASN.1 结构)
- RFC 5280:定义互联网环境下的具体编码约束和语义规则
- 证书字段解析错误 → 违反扩展关键字约束
- CRL 验证失败 → 遗漏 CRL 分发点检查
- 国密证书互操作性问题 → OID 映射不符合 RFC 5280 的 algorithmIdentifier 规则
RFC 5280 证书结构
证书整体结构
X.509 证书采用 ASN.1 DER 编码,其顶层结构如下:
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 | v3 证书值为 2(注意:从 0 开始计数) |
serialNumber | INTEGER | 证书序列号,由 CA 分配,在同一 CA 内唯一 |
signature | AlgorithmIdentifier | 签名算法 OID(如 SHA-256 with RSA) |
issuer | Name | 签发者 distinguished name(DN) |
validity | SEQUENCE | notBefore 和 notAfter 时间戳 |
subject | Name | 证书持有者 DN |
subjectPublicKeyInfo | SEQUENCE | 公钥信息(算法 + 公钥值) |
extensions | SEQUENCE | 扩展字段列表 |
TBSCertificate 字段详解
#### 1. 版本号(version)
RFC 5280 规定,X.509 v3 证书的 version 字段必须显式设置为整数 2:
Version ::= INTEGER { v1(0), v2(1), v3(2) }常见错误:某些旧实现将 version 字段省略(默认 v1),这在 RFC 5280 下是非法的。v1 证书不支持扩展字段,无法承载现代 PKI 所需的关键信息。
#### 2. 序列号(serialNumber)
证书序列号是 CA 为每张证书分配的唯一标识符。RFC 5280 规定:
- 序列号必须是正整数
- 在同一个 CA 签发的证书集中,序列号必须唯一
- 推荐使用随机序列号以避免预测攻击
- 序列号长度通常不超过 20 字节
#### 3. 签名算法(signature)
signature 字段使用 AlgorithmIdentifier 结构:
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}对于 X.509 v3 证书,该字段定义的是证书签名算法(即 CA 用来签署 TBSCertificate 的算法),而非证书中公钥的签名算法(后者在 subjectPublicKeyInfo 中定义)。
常见误区:证书签名算法与公钥算法可以不同。例如,CA 可以使用 RSA-SHA256 签名算法为 SM2 公钥证书签发。
#### 4. 颁发者(issuer)和持有者(subject)
issuer 和 subject 都是 Name 类型,由一组 RDN(Relative Distinguished Name)组成:
Name ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type ATTRIBUTE.&id (AttributeType),
value ATTRIBUTE.&Type (AttributeType)
}标准属性类型包括:
CN(Common Name):对象名O(Organization):组织名OU(Organizational Unit):组织单位C(Country):国家代码emailAddress:电子邮件地址
CN。#### 5. 有效期(validity)
validity 字段定义证书的有效时间范围:
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time
}
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime
}RFC 5280 规定:
notBefore应使用UTCTime(YYYYMMDDHHMMSSZ 格式)- 对于 2049 年之前的日期,使用
UTCTime - 对于 2050 年及之后的日期,使用
GeneralizedTime(YYYYMMDDHHMMSSZ 格式)
#### 6. 公钥信息(subjectPublicKeyInfo)
subjectPublicKeyInfo 包含公钥算法标识和公钥值:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}对于 SM2 证书,algorithm 应为 SM2 签名或加密算法的 OID(如 1.2.156.10197.1.301),subjectPublicKey 包含 SM2 公钥点(通常为 65 字节 uncompressed form:0x04 || x || y)。
扩展字段(Extensions)
RFC 5280 定义了 X.509 v3 证书的核心扩展机制。扩展字段位于 TBSCertificate 的 extensions 字段中:
Extensions ::= SEQUENCE OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING
}#### 必需扩展
RFC 5280 规定了若干必须在特定场景下出现的扩展:
| 扩展 OID | 扩展名称 | 必需场景 | 是否关键 |
|---|---|---|---|
| 2.5.29.1 | authorityKeyIdentifier | CA 证书、中间 CA 证书 | 否 |
| 2.5.29.2 | keyUsage | 所有证书 | 是(CA 证书) |
| 2.5.29.15 | keyUsage | 所有证书 | 是(CA 证书) |
| 2.5.29.17 | subjectAltName | 大多数叶子证书 | 视策略 |
| 2.5.29.19 | basicConstraints | CA 证书 | 是 |
| 2.5.29.35 | authorityKeyIdentifier | 除根证书外的所有证书 | 是 |
basicConstraints(基本约束):
BasicConstraints ::= SEQUENCE {
cA BOOLEAN DEFAULT FALSE,
pathLenConstraint INTEGER (0..MAX) OPTIONAL
}cA=TRUE表示该证书是 CA 证书pathLenConstraint限制下级 CA 证书的数量(不包括该证书本身)- 注意:叶子证书必须设置
cA=FALSE,否则可能被用于签发下级证书
KeyUsage ::= BIT STRING {
digitalSignature (0),
nonRepudiation (1), -- old name: contentCommitment
keyEncipherment (2),
dataEncipherment (3),
keyAgreement (4),
keyCertSign (5),
cRLSign (6),
encipherOnly (7),
decipherOnly (8)
}RFC 5280 规定了各 bit 的语义:
keyCertSign:证书签名密钥,仅 CA 证书应设置cRLSign:CRL 签名密钥,仅 CA 证书应设置digitalSignature:数字签名,叶子证书通常设置keyEncipherment:密钥加密,RSA 证书常用keyAgreement:密钥协商,ECDH/SM2 密钥交换时使用
AuthorityKeyIdentifier ::= SEQUENCE {
keyIdentifier [0] KEYIDENTIFIER OPTIONAL,
authorityCertIssuer [1] GeneralNames OPTIONAL,
authorityCertSerialNumber [2] INTEGER OPTIONAL
}keyIdentifier:签发者公钥的哈希值(通常是 SHA-1 或 SHA-256)authorityCertIssuer:签发者证书的 DNauthorityCertSerialNumber:签发者证书的序列号
#### 可选扩展详解
subjectAltName(主体别名):
SubjectAltName ::= GeneralNames
GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
GeneralName ::= CHOICE {
otherName [0] OtherName,
rfc822Name [1] IA5String,
dNSName [2] IA5String,
x400Address [3] ORAddress,
directoryName [4] Name,
ediPartyName [5] EDIPartyName,
uniformResourceIdentifier [6] IA5String,
iPAddress [7] OCTET STRING,
registeredID [8] OBJECT IDENTIFIER
}常见用途:
dNSName:域名(如www.example.com)iPAddress:IP 地址(如192.168.1.1)rfc822Name:电子邮件地址otherName:自定义类型(如 SM2 证书中的用户标识)
CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint
DistributionPoint ::= SEQUENCE {
distributionPoint [0] DistributionPointName OPTIONAL,
reasons [1] ReasonFlags OPTIONAL,
cRLIssuer [2] Name OPTIONAL
}该扩展提供获取 CRL 的 URL 或 DN 信息,是证书吊销检查的重要机制。
CRL 结构详解
CRL 整体结构
X.509 CRL 同样采用 ASN.1 DER 编码:
CertificateRevocationList ::= SEQUENCE {
tbsCertList TBSCertList,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
TBSCertList ::= SEQUENCE {
version [0] EXPLICIT Version OPTIONAL,
signature AlgorithmIdentifier,
issuer Name,
thisUpdate Time,
nextUpdate [1] Time OPTIONAL,
revokedCertificates [2] SEQUENCE OF SEQUENCE {
userCertificate CertificateSerialNumber,
revocationDate Time,
crlEntryExtensions [0] Extensions OPTIONAL
} OPTIONAL,
crlExtensions [3] EXPLICIT Extensions OPTIONAL
}CRL 关键字段
| 字段 | 说明 |
|---|---|
version | v2 CRL(值为 1) |
signature | CRL 签名算法(与签发证书相同) |
issuer | 签发 CRL 的 CA DN |
thisUpdate | CRL 最新更新时间 |
nextUpdate | 下次 CRL 预计更新时间 |
revokedCertificates | 被吊销证书列表(可为空) |
crlExtensions | CRL 扩展字段 |
吊销原因码(Reason Flags)
RFC 5280 定义了以下吊销原因:
| 原因码 | 值 | 说明 |
|---|---|---|
| keyCompromise | 0 | 私钥泄露 |
| cACompromise | 1 | CA 私钥泄露 |
| affiliationChanged | 2 | 隶属关系变更 |
| superseded | 3 | 证书被替换 |
| cessationOfOperation | 4 | 服务终止 |
| privilegeWithdrawn | 5 | 权限被撤销 |
| aaCompromise | 6 | 认证机构违规 |
CRL 扩展字段
RFC 5280 定义了若干 CRL 扩展:
| 扩展 OID | 名称 | 说明 |
|---|---|---|
| 2.5.29.1 | authorityKeyIdentifier | 授权密钥标识符 |
| 2.5.29.2 | issuerAltName | 颁发者别名 |
| 2.5.29.5 | authorityInfoAccess | 授权信息访问 |
| 2.5.29.20 | freshestCRL | 最新 CRL 分发点 |
| 2.5.29.21 | cRLNumber | CRL 序列号 |
| 2.5.29.28 | issuerUniqueID | 颁发者唯一标识 |
| 2.5.29.37 | deltaCRLIndicator | 增量 CRL 指示符 |
CRLNumber ::= INTEGERdeltaCRLIndicator:
DeltaCRLIndicator ::= INTEGER国密 SM2 证书在 RFC 5280 框架下的适配
OID 映射
国密算法在 RFC 5280 框架下需要通过 OID 进行标识。主要映射关系如下:
| 算法 | OID | RFC 5280 兼容方式 |
|---|---|---|
| SM2 签名 | 1.2.156.10197.1.501 | algorithmIdentifier |
| SM2 加密 | 1.2.156.10197.1.301 | algorithmIdentifier |
| SM2 密钥交换 | 1.2.156.10197.1.303 | algorithmIdentifier |
| SM3 | 1.2.156.10197.1.401 | hashAlgorithm |
| SM4 | 1.2.156.10197.1.402 | encryptionAlgorithm |
SM2 证书的特殊处理
#### 1. 公钥格式
SM2 公钥采用 uncompressed point form(65 字节):
0x04 || x (32 bytes) || y (32 bytes)在 subjectPublicKeyInfo 中:
subjectPublicKey BIT STRING
-- 内容为 0x04 || x || y#### 2. 扩展字段
SM2 证书通常需要以下扩展:
basicConstraints:cA=FALSEkeyUsage:根据用途设置digitalSignature、keyEncipherment等subjectAltName:包含域名或 IP 地址authorityKeyIdentifier:指向签发者证书
在国密 TLS(GM/T 0024)中,SM2 证书的 subjectPublicKeyInfo 需使用国密算法 OID,而证书签名仍可使用 RSA-SHA256 或 SM2-SM3。
双证书场景:
- 签名证书:使用 SM2-SM3 签名,公钥为 SM2
- 加密证书:使用 RSA-SHA256 签名,公钥为 SM2(仅用于加密)
证书路径验证与 RFC 5280
路径验证算法
RFC 5280 第 6 章定义了 X.509 证书路径验证算法,核心步骤包括:
- 构建证书路径:从叶子证书到根证书的证书序列
- 验证签名链:每个证书的签名由上级证书验证
- 检查有效期:所有证书的
validity字段覆盖当前时间 - 检查吊销状态:通过 CRL 或 OCSP 验证证书未被吊销
- 验证策略约束:检查
policyConstraints和inhibitAnyPolicy - 检查名字约束:验证
nameConstraints限制 - 验证基本约束:检查
basicConstraints的cA和pathLenConstraint - 验证密钥用途:检查
keyUsage是否允许相应操作
策略映射与约束
policyConstraints:
PolicyConstraints ::= SEQUENCE {
requireExplicitPolicy [0] INTEGER OPTIONAL,
inhibitPolicyMapping [1] INTEGER OPTIONAL
}requireExplicitPolicy:限制从多少级证书开始需要明确策略inhibitPolicyMapping:限制策略映射的跳数
NameConstraints ::= SEQUENCE {
permittedSubtrees [0] GeneralSubtrees OPTIONAL,
excludedSubtrees [1] GeneralSubtrees OPTIONAL
}RFC 5280 在国密体系中的应用
国密证书合规性检查
在实际密评中,RFC 5280 的相关条款常被用作检查依据:
| 检查项 | RFC 5280 条款 | 常见不合规情况 |
|---|---|---|
| 证书序列号唯一性 | Section 4.1.2.2 | 重复序列号 |
| 有效期格式正确性 | Section 4.1.2.5 | 使用 GeneralizedTime 不当 |
| basicConstraints 正确性 | Section 4.2.1.9 | CA 证书未设置 cA=TRUE |
| keyUsage 合法性 | Section 4.2.1.3 | 叶子证书设置 keyCertSign |
| authorityKeyIdentifier | Section 4.2.1.1 | 缺少或格式错误 |
| CRL 分发点有效性 | Section 4.2.1.14 | URL 不可访问 |
国密 SM2 证书的 RFC 5280 兼容性
国密 SM2 证书在 RFC 5280 框架下的兼容性要点:
- 算法标识:使用 GM/T 0006 定义的 OID 替换 RFC 5280 中的国际算法 OID
- 公钥格式:SM2 公钥采用 uncompressed point,与 SEC 1 标准一致
- 扩展字段:遵循 RFC 5280 的扩展格式,但可添加国密专用扩展
- CRL 格式:完全兼容 RFC 5280 CRL 结构
相关实践链接
参考标准
- RFC 5280:Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
- ITU-T X.509 (2001):The Directory — Public-key and attribute certificate frameworks
- GM/T 0006-2023:密码应用标识规范
- GM/T 0015-2023:数字证书格式