RFC 5280 X.509 证书与 CRL 详细规范:PKI 信任链的底层协议

协议详解 · 2026-08-26

概述

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:定义互联网环境下的具体编码约束和语义规则
为什么学习 RFC 5280? 因为几乎所有 PKI 实现问题都可以追溯到对 RFC 5280 条款的误解。例如:
  • 证书字段解析错误 → 违反扩展关键字约束
  • CRL 验证失败 → 遗漏 CRL 分发点检查
  • 国密证书互操作性问题 → OID 映射不符合 RFC 5280 的 algorithmIdentifier 规则
本文系统解析 RFC 5280 的核心内容,为理解和实现 PKI 系统提供协议层面的坚实基础。

RFC 5280 证书结构

证书整体结构

X.509 证书采用 ASN.1 DER 编码,其顶层结构如下:

关键字段解析:

字段类型说明
versionINTEGERv3 证书值为 2(注意:从 0 开始计数)
serialNumberINTEGER证书序列号,由 CA 分配,在同一 CA 内唯一
signatureAlgorithmIdentifier签名算法 OID(如 SHA-256 with RSA)
issuerName签发者 distinguished name(DN)
validitySEQUENCEnotBefore 和 notAfter 时间戳
subjectName证书持有者 DN
subjectPublicKeyInfoSEQUENCE公钥信息(算法 + 公钥值)
extensionsSEQUENCE扩展字段列表

TBSCertificate 字段详解

#### 1. 版本号(version)

RFC 5280 规定,X.509 v3 证书的 version 字段必须显式设置为整数 2:

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

常见错误:某些旧实现将 version 字段省略(默认 v1),这在 RFC 5280 下是非法的。v1 证书不支持扩展字段,无法承载现代 PKI 所需的关键信息。

#### 2. 序列号(serialNumber)

证书序列号是 CA 为每张证书分配的唯一标识符。RFC 5280 规定:

  • 序列号必须是正整数
  • 在同一个 CA 签发的证书集中,序列号必须唯一
  • 推荐使用随机序列号以避免预测攻击
  • 序列号长度通常不超过 20 字节
安全注意:序列化号不应包含敏感信息(如时间戳、用户 ID),否则可能泄露 CA 内部状态。

#### 3. 签名算法(signature)

signature 字段使用 AlgorithmIdentifier 结构:

ASN1
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)组成:

ASN1
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 通常包含证书持有者的中文名称,O 包含机构名称,C 固定为 CN。

#### 5. 有效期(validity)

validity 字段定义证书的有效时间范围:

ASN1
Validity ::= SEQUENCE {
    notBefore     Time,
    notAfter      Time
}
Time ::= CHOICE {
    utcTime        UTCTime,
    generalTime    GeneralizedTime
}

RFC 5280 规定:

  • notBefore 应使用 UTCTime(YYYYMMDDHHMMSSZ 格式)
  • 对于 2049 年之前的日期,使用 UTCTime
  • 对于 2050 年及之后的日期,使用 GeneralizedTime(YYYYMMDDHHMMSSZ 格式)
实践提示:证书有效期不应超过根证书有效期,且通常受策略限制(如 CA/B 论坛要求公开信任的证书有效期不超过 398 天)。

#### 6. 公钥信息(subjectPublicKeyInfo)

subjectPublicKeyInfo 包含公钥算法标识和公钥值:

ASN1
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 字段中:

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

#### 必需扩展

RFC 5280 规定了若干必须在特定场景下出现的扩展:

扩展 OID扩展名称必需场景是否关键
2.5.29.1authorityKeyIdentifierCA 证书、中间 CA 证书否
2.5.29.2keyUsage所有证书是(CA 证书)
2.5.29.15keyUsage所有证书是(CA 证书)
2.5.29.17subjectAltName大多数叶子证书视策略
2.5.29.19basicConstraintsCA 证书是
2.5.29.35authorityKeyIdentifier除根证书外的所有证书是
#### 关键扩展详解

basicConstraints(基本约束):

ASN1
BasicConstraints ::= SEQUENCE {
    cA                      BOOLEAN DEFAULT FALSE,
    pathLenConstraint       INTEGER (0..MAX) OPTIONAL
}
  • cA=TRUE 表示该证书是 CA 证书
  • pathLenConstraint 限制下级 CA 证书的数量(不包括该证书本身)
  • 注意:叶子证书必须设置 cA=FALSE,否则可能被用于签发下级证书
keyUsage(密钥用途):

ASN1
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(授权密钥标识符):

ASN1
AuthorityKeyIdentifier ::= SEQUENCE {
    keyIdentifier           [0] KEYIDENTIFIER OPTIONAL,
    authorityCertIssuer     [1] GeneralNames OPTIONAL,
    authorityCertSerialNumber [2] INTEGER OPTIONAL
}
  • keyIdentifier:签发者公钥的哈希值(通常是 SHA-1 或 SHA-256)
  • authorityCertIssuer:签发者证书的 DN
  • authorityCertSerialNumber:签发者证书的序列号
这三个字段组合使用,可以唯一标识签发者证书。

#### 可选扩展详解

subjectAltName(主体别名):

常见用途:

  • dNSName:域名(如 www.example.com)
  • iPAddress:IP 地址(如 192.168.1.1)
  • rfc822Name:电子邮件地址
  • otherName:自定义类型(如 SM2 证书中的用户标识)
cRLDistributionPoints(CRL 分发点):

ASN1
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 编码:

CRL 关键字段

字段说明
versionv2 CRL(值为 1)
signatureCRL 签名算法(与签发证书相同)
issuer签发 CRL 的 CA DN
thisUpdateCRL 最新更新时间
nextUpdate下次 CRL 预计更新时间
revokedCertificates被吊销证书列表(可为空)
crlExtensionsCRL 扩展字段

吊销原因码(Reason Flags)

RFC 5280 定义了以下吊销原因:

原因码值说明
keyCompromise0私钥泄露
cACompromise1CA 私钥泄露
affiliationChanged2隶属关系变更
superseded3证书被替换
cessationOfOperation4服务终止
privilegeWithdrawn5权限被撤销
aaCompromise6认证机构违规

CRL 扩展字段

RFC 5280 定义了若干 CRL 扩展:

扩展 OID名称说明
2.5.29.1authorityKeyIdentifier授权密钥标识符
2.5.29.2issuerAltName颁发者别名
2.5.29.5authorityInfoAccess授权信息访问
2.5.29.20freshestCRL最新 CRL 分发点
2.5.29.21cRLNumberCRL 序列号
2.5.29.28issuerUniqueID颁发者唯一标识
2.5.29.37deltaCRLIndicator增量 CRL 指示符
cRLNumber:
ASN1
CRLNumber ::= INTEGER
每个 CRL 应有唯一的递增序号,用于防止 CRL 重放攻击。

deltaCRLIndicator:

ASN1
DeltaCRLIndicator ::= INTEGER
指向基础 CRL 的序号,支持增量 CRL 更新机制。

国密 SM2 证书在 RFC 5280 框架下的适配

OID 映射

国密算法在 RFC 5280 框架下需要通过 OID 进行标识。主要映射关系如下:

算法OIDRFC 5280 兼容方式
SM2 签名1.2.156.10197.1.501algorithmIdentifier
SM2 加密1.2.156.10197.1.301algorithmIdentifier
SM2 密钥交换1.2.156.10197.1.303algorithmIdentifier
SM31.2.156.10197.1.401hashAlgorithm
SM41.2.156.10197.1.402encryptionAlgorithm
注意:RFC 5280 本身未定义国密 OID,国密 OID 由 GM/T 0006《密码应用标识规范》定义。在实际实现中,需要在 RFC 5280 的算法标识框架内嵌入国密 OID。

SM2 证书的特殊处理

#### 1. 公钥格式

SM2 公钥采用 uncompressed point form(65 字节):

CODE
0x04 || x (32 bytes) || y (32 bytes)

在 subjectPublicKeyInfo 中:

ASN1
subjectPublicKey BIT STRING
-- 内容为 0x04 || x || y

#### 2. 扩展字段

SM2 证书通常需要以下扩展:

  • basicConstraints:cA=FALSE
  • keyUsage:根据用途设置 digitalSignature、keyEncipherment 等
  • subjectAltName:包含域名或 IP 地址
  • authorityKeyIdentifier:指向签发者证书
#### 3. 国密 TLS 适配

在国密 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:

ASN1
PolicyConstraints ::= SEQUENCE {
    requireExplicitPolicy [0] INTEGER OPTIONAL,
    inhibitPolicyMapping  [1] INTEGER OPTIONAL
}
  • requireExplicitPolicy:限制从多少级证书开始需要明确策略
  • inhibitPolicyMapping:限制策略映射的跳数
nameConstraints:
ASN1
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.9CA 证书未设置 cA=TRUE
keyUsage 合法性Section 4.2.1.3叶子证书设置 keyCertSign
authorityKeyIdentifierSection 4.2.1.1缺少或格式错误
CRL 分发点有效性Section 4.2.1.14URL 不可访问

国密 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:数字证书格式