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证书的有序证书列表。验证过程自底向上:用上一级证书的公钥验证下一级证书的签名,直到信任锚。
证书链校验关键步骤:
- 提取实体证书及其签发者信息(Issuer字段)。
- 在本地证书存储中查找签发者证书。
- 用签发者公钥验证实体证书的数字签名。
- 递归验证签发者证书,直到根CA。
- 确认根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安全性的最后一道防线。
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过期异常。