3. 密码学基础(下)

上一节我们聊了非对称加密和哈希,算是把密码学的「零件」认全了。但光有零件可造不出车——你想想看,你拿到了 Bob 的公钥,怎么确定这公钥真的是 Bob 的?万一中间人把公钥换成了他自己的呢?

这就是 PKI 要解决的核心问题:如何在大规模、不可信的网络里,安全地分发和验证公钥。

3.1 公钥基础设施(PKI)——信任的骨架

PKI 不是某个具体的算法,而是一整套策略、流程、硬件、软件的组合。我习惯把它理解成「数字世界的身份证系统」。

一个完整的 PKI 体系包含以下几个核心角色:

角色 类比 核心职责
证书颁发机构(CA) 公安局/出入境管理局 签发、吊销证书,是整个信任链的根
注册机构(RA) 派出所/街道办 审核申请者身份的真实性,把审核结果交给 CA
证书持有者 持证人 拥有自己的公私钥对,向别人出示证书证明身份
依赖方 查身份证的人 验证证书是否有效,决定是否信任对方
证书库/仓库 全国人口信息库 存储已签发证书和吊销列表(CRL)

一句话总结 PKI 的价值:它把「你直接信任 Bob」这个一对一问题,转化成了「你信任 CA,CA 担保 Bob」这个可扩展的三方模型。

3.2 证书颁发机构(CA)——信任的源头

CA 是 PKI 里最核心的实体。它的工作说白了就两件:发证和收证。

3.2.1 CA 怎么签发证书?

流程大致是这样:

  1. 申请者生成密钥对:自己本地生成,私钥永远不离开本地。
  2. 申请者提交 CSR:Certificate Signing Request,里面包含公钥和身份信息。
  3. RA 审核身份:个人要验身份证,企业要验营业执照。我见过有些项目图省事跳过了这步,结果证书被冒领,教训很深刻。
  4. CA 签发证书:CA 用自己的私钥对申请者的公钥+身份信息做数字签名。
  5. 返回证书:申请者拿到 X.509 格式的证书文件。

一个小技巧:生产环境里,CA 的私钥一定要放在硬件安全模块(HSM)里。我曾经见过直接把 CA 私钥存文本文件里的操作……嗯,那项目后来被审计打了个不及格。

3.2.2 证书里到底有什么?

X.509 证书是最通用的格式。打开一个证书看看,里面字段不少,但核心就这几个:

字段 含义 我关注的点
Subject 证书持有者身份(CN、O、OU 等) CN 必须和域名严格匹配
Issuer 签发该证书的 CA 身份 用来追溯上级 CA
Subject Public Key Info 持有者的公钥和算法 RSA 2048 起步,现在推荐 4096
Validity 生效和过期时间 过期证书是安全漏洞的重灾区
Signature CA 对证书内容的数字签名 验证证书完整性的关键
Serial Number CA 分配给证书的唯一编号 吊销时靠它定位

3.3 证书链——信任的传递

你想想看,如果全世界所有证书都直接由一个根 CA 签发,那根 CA 的私钥一旦泄露,整个互联网都得瘫痪。所以实际 PKI 用的是层级结构。

3.3.1 三层模型

最常见的结构是三层:

  1. 根 CA(Root CA):自签名证书,是整个信任链的锚点。平时离线保存,极少使用。
  2. 中间 CA(Intermediate CA):由根 CA 签发,负责实际签发终端证书。可以有多个层级。
  3. 终端证书(Leaf/End-entity Certificate):发给网站、设备、用户的证书。

为什么要这么设计?说白了就是风险隔离。中间 CA 的私钥泄露了,根 CA 可以吊销它,重新签发一个,根 CA 本身不受影响。

注意:证书链的验证是自下而上的。从终端证书开始,逐级验证上一级证书的签名,直到找到本地信任的根证书。中间任何一环断了,证书就不可信。

3.3.2 证书链的 SVG 结构图

下面这张图展示了典型的证书链结构:

证书链层级结构图 根 CA(Root CA) 自签名,离线保存 中间 CA(Intermediate CA) 由根 CA 签发 终端证书 A 由中间 CA 签发 终端证书 B 由中间 CA 签发 验证方向:自下而上 终端证书 → 中间 CA → 根 CA 每一级验证上一级的数字签名 直到找到本地信任的根证书

3.4 证书验证——信任链的检查

当浏览器访问 HTTPS 网站时,它背后做了一系列证书验证。我拆开来说:

3.4.1 验证步骤

  1. 证书有效期检查:当前时间是否在 Validity 范围内?过期直接报错。
  2. 域名匹配检查:证书的 CN 或 SAN 是否和访问的域名一致?
  3. 吊销状态检查:通过 CRL 或 OCSP 查询证书是否被吊销。
  4. 签名链验证:逐级验证签名,直到信任的根证书。
  5. 密钥用法检查:证书的 Key Usage 是否允许当前用途?

避坑指南:我曾经遇到过一个案例,证书链里中间 CA 的证书没配全,服务端只发了终端证书。结果 Android 设备能通过(因为它内置了中间 CA),但 iOS 设备死活不认。解决方案很简单:服务端配置证书链时,把中间 CA 证书一起发过去。

3.4.2 吊销机制

证书还没到期就被吊销,原因可能是私钥泄露、域名变更、员工离职。两种主流方式:

方式 原理 优缺点
CRL(证书吊销列表) CA 定期发布一个被吊销证书的列表 简单,但有延迟,列表会越来越大
OCSP(在线证书状态协议) 实时查询单个证书的状态 实时性好,但 CA 要扛住查询压力
OCSP Stapling 服务端自己缓存 OCSP 结果,发给客户端 减轻 CA 压力,保护用户隐私

3.5 实际项目中的 PKI 设计建议

做了这么多年安全架构,我总结了几条 PKI 落地的铁律:

  • 根 CA 必须离线:物理隔离,只在签发中间 CA 时才通电。我见过把根 CA 放服务器上天天跑着的,那跟裸奔没区别。
  • 中间 CA 按用途拆分:SSL 证书一个中间 CA,代码签名一个,邮件加密一个。一个泄露不影响其他。
  • 证书有效期要短:以前证书有效期五年,现在行业趋势是 1 年甚至 90 天。短周期能降低吊销成本。
  • 自动化证书管理:用 ACME 协议(比如 Let's Encrypt)自动续期。手动换证书太容易出错了。
  • 监控证书过期:提前 30 天、7 天、1 天告警。证书过期导致的服务中断,我见过太多次了。

最后说一句:PKI 不是银弹。它解决的是「公钥属于谁」的问题,但解决不了「私钥是否被偷」的问题。私钥保护,那是另一门学问了。