3、公钥基础设施(PKI):CA证书、证书链、X.509标准、证书吊销列表(CRL)

公钥基础设施(PKI)是支撑数字签名、加密通信和身份认证的信任骨架。在IDP门户签名证据校验中,PKI决定了“谁签的名”“证书是否可信”“签名是否有效”。本章从CA证书、证书链、X.509标准、CRL四个核心构件展开,建立PKI的完整认知。

3.1 CA证书与信任锚

CA(Certificate Authority,证书颁发机构)是PKI的信任起点。CA证书是自签名的根证书,代表一个信任域的最高权威。在IDP场景中,SP(服务提供商)预置的CA证书列表决定了它信任哪些IDP颁发的签名证书。

角色 说明 IDP校验中的典型用途
根CA 自签名,信任锚点 预置于SP信任存储区
中间CA 由根CA签发,向下授权 签发实体证书,隔离根密钥风险
实体证书 最终用户或服务器证书 IDP签名SAML/OIDC断言时使用的证书
信任锚原则:校验签名时,验证路径必须终止于一个本地信任的根CA证书。如果根CA不在信任列表中,即使证书链完整,签名也不应被信任。

3.2 证书链与路径验证

证书链(Certificate Chain)是从实体证书到根CA证书的有序证书列表。验证过程自底向上:用上一级证书的公钥验证下一级证书的签名,直到信任锚。

证书链验证流程 根CA证书(信任锚) 中间CA证书 IDP签名证书 验证方向 用上级公钥验证下级签名 逐级向上,直到信任锚 证书链长度 ≥ 2 根CA必须预置信任
证书链校验关键步骤:
  1. 提取实体证书及其签发者信息(Issuer字段)。
  2. 在本地证书存储中查找签发者证书。
  3. 用签发者公钥验证实体证书的数字签名。
  4. 递归验证签发者证书,直到根CA。
  5. 确认根CA在本地信任列表中。

3.3 X.509标准

X.509是PKI中最广泛使用的证书格式标准,定义了证书字段、扩展项和吊销机制。IDP门户签发的签名证书几乎全部遵循X.509 v3版本。

字段 含义 IDP校验中的关注点
Version 证书版本(v1/v2/v3) 现代PKI要求v3
Serial Number CA分配的唯一序列号 用于CRL查询
Signature Algorithm 签名算法标识 必须与签名值算法一致
Issuer 签发者DN(Distinguished Name) 用于构建证书链
Validity 有效期(notBefore / notAfter) 签名时证书必须在有效期内
Subject 主体DN 标识证书持有者身份
Subject Public Key Info 公钥算法和公钥值 用于验证签名
Extensions v3扩展(如Key Usage、Basic Constraints) 约束证书用途和CA属性
常见校验陷阱:X.509 v3扩展中的 Key Usage 必须包含 digitalSignature,否则证书不能用于数字签名验证。IDP签名证书若缺少该标记,即使链完整也应判定为无效。

3.4 证书吊销列表(CRL)

CRL(Certificate Revocation List)是CA定期发布的已吊销证书序列号列表。即使证书在有效期内且链完整,如果出现在CRL中,签名仍应被拒绝。CRL是PKI安全性的最后一道防线。

CRL查询与校验流程 CA证书颁发机构 CRL分发点 SP/RP校验方 CRL校验要点 1. 获取CRL(HTTP/LDAP) 2. 验证CRL签名(CA签发) 3. 检查证书序列号是否在列表中

3.5 CRL与OCSP对比

CRL是离线列表,OCSP(在线证书状态协议)提供实时查询。IDP门户签名证据校验中,两者常配合使用。

特性 CRL OCSP
实时性 依赖发布周期(小时/天) 实时查询
网络依赖 可离线缓存 必须在线
数据量 随吊销数量增长 单条查询,响应小
隐私 不暴露查询目标 暴露被查询证书
IDP场景 批量校验时优先使用 高安全场景补充校验
IDP签名证据校验中的PKI最佳实践:
  • 始终验证证书链到预置的信任锚。
  • 检查证书有效期(Validity)和Key Usage扩展。
  • 获取并缓存CRL,定期刷新。
  • 对高价值交易,额外发起OCSP查询。
  • 记录证书序列号和吊销状态,用于审计。

3.6 证书链构建示例(代码)

以下Java代码片段展示如何从实体证书构建证书链并验证到信任锚:

// 加载实体证书
X509Certificate entityCert = loadCertificate("idp-signing.cer");

// 加载信任存储(根CA列表)
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new FileInputStream("truststore.jks"), "changeit".toCharArray());

// 构建证书链
CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
PKIXBuilderParameters params = new PKIXBuilderParameters(trustStore, 
    new X509CertSelector() {{
        setCertificate(entityCert);
    }});
params.setRevocationEnabled(false); // 单独处理CRL

CertPathBuilderResult result = builder.build(params);
CertPath certPath = result.getCertPath();

// 验证链
CertPathValidator validator = CertPathValidator.getInstance("PKIX");
PKIXParameters validateParams = new PKIXParameters(trustStore);
validateParams.setRevocationEnabled(false);
validator.validate(certPath, validateParams);

System.out.println("证书链验证通过,路径长度: " + certPath.getCertificates().size());
生产环境注意:上述代码关闭了吊销检查(setRevocationEnabled(false)),实际部署时应启用CRL分发点(CDP)或OCSP响应者,并处理网络超时和CRL过期异常。