密码学应用基础 · kp-009
数字签名与 PKI 证书体系
核心
约 20 分钟
状态:reviewed
#密码学#数字签名#PKI#CA
一句话定义
数字签名用私钥对数据的哈希值运算、用公钥验证,一次性提供完整性、来源真实性与不可否认性;PKI(公钥基础设施)通过 CA 签发的证书链解决"这把公钥真的属于它声称的主体吗"的信任传递问题。
为什么重要
公钥密码学留下最后一个缺口:你怎么知道手里的公钥不是攻击者掉包的?签名 + PKI 是这个缺口的标准答案——浏览器敢把地址栏变成锁标志,依赖的正是操作系统内置的根证书与证书链校验。理解它,才能理解 HTTPS 信任模型、代码签名、以及证书过期/吊销类事故(这是生产环境最常见的"突发不可用"来源之一)。
前置知识
kp-007(非对称加密):签名是同一密钥对的另一种用法。 kp-008(哈希):签名对象是摘要而非原文。
核心概念
- 签名流程:签名方计算 s = Sign(私钥, H(m));验证方校验 Verify(公钥, m, s)。RSA 签名与 ECDSA/EdDSA 是主流算法。
- 三重保证:完整性(哈希不匹配即失败)、真实性(只有私钥持有者能生成有效签名)、不可否认性(第三方可验证,签名者难以抵赖)。
- X.509 证书:把"主体身份 + 公钥 + 有效期 + 用途"绑定,由 CA 私钥签名;信任锚(根证书)预置于操作系统与浏览器。
- 证书链:根 CA → 中间 CA → 叶子证书,验证即逐级验签到信任锚。
- 吊销机制:CRL(吊销列表)与 OCSP(在线状态查询),以及软失败(查询失败默认放行)的现实妥协;证书透明度(CT)要求所有签发进入公开日志以抑制 CA 滥发。
- 自动化签发:Let's Encrypt 与 ACME 协议使证书申请/续期可完全自动化,90 天短有效期成为主流实践。
公式、模型或图示
签名: s = Sign(sk, H(m)) 验证: Verify(pk, m, s) → 通过/失败
证书链校验:
[根CA·信任锚] ──签发──▶ [中间CA] ──签发──▶ [example.com 叶子证书]
逐级验签 + 校验有效期/域名/用途/吊销状态 → 锁标志原理与机制
PKI 的本质是把信任从"点对点"改为"经认证的分发":与其让每对通信方线下交换公钥指纹,不如让双方都信任的第三方(CA)为公钥背书。安全性因此取决于 CA 生态的约束机制:审计、CT 公开日志、浏览器信任策略共同抑制个别 CA 作恶(历史上曾多次出现 CA 被吊销信任的事件)。工程侧的高频风险不是数学失效而是运维失效:证书过期导致全站不可访问、吊销检查软失败掩盖中间人风险、私钥落盘权限过宽导致泄露。现代缓解是"自动化 + 短有效期":把续期做成无人值守流程,把泄露窗口从一年压到数周。
实例或案例
- HTTPS 部署:用 ACME 客户端自动签发与续期,配置完整证书链(漏配中间证书是"部分用户打不开"的经典事故)。
- 代码签名:软件发布对二进制签名,操作系统校验后才运行,防止分发链被植入(与 kp-024 供应链治理衔接)。
- 反例:运维团队把证书续期做成"到期日历提醒",一次假期遗漏导致停服——自动化缺失是签名体系最常见的实战故障。
直观类比
PKI 像公证处体系:你不认识陌生人,但你们都认识同一家公证处(CA);公证书(证书)写着"此人确系本人",且公证处之上还有行业总会(根 CA)背书。吊销机制相当于公证处的"作废声明公告栏"。
常见误区
- 把签名当加密:"签名 = 用私钥加密"是对流程的粗略概括,语义完全不同:加密保保密性,签名保真实性与完整性。
- 自签名证书用于生产:自签没有第三方背书,客户端要么报警要么被迫信任,等于放弃 PKI 的核心价值。
- 只看证书没过期:还需校验域名匹配、用途(EKU)、吊销状态与链完整性。
与其他知识点的关系
- kp-018(TLS 原理与配置加固):证书校验发生在 TLS 握手之内,配置与运维细节见该课。
- kp-024(供应链与依赖治理):代码签名与制品校验是供应链完整性的关键控制。
自测题
- 签名同时提供哪三重保证?分别由哪个机制支撑?要点:完整性(哈希比对)、真实性(私钥唯一性)、不可否认性(第三方可验证)。
- 为什么需要 CA?直接交换公钥不行吗?要点:裸公钥无法防掉包(中间人可替换公钥),CA 提供经过认证的身份-公钥绑定。
- 证书"软失败"吊销检查有什么风险?要点:OCSP 查询失败默认放行,攻击者阻断查询即可掩盖被吊销证书,属于可用性优先的妥协。
延伸阅读
《Bulletproof SSL and TLS》(Ivan Ristić):TLS 与 PKI 的工程实操权威参考。