公钥基础设施(PKI)概述:核心组成与标准

聊到密钥管理,就绕不开 PKI。说白了,PKI 就是一套让数字世界互相信任的规则和工具。我经常跟团队讲,没有 PKI,你发的加密消息跟写在明信片上没区别。

PKI 不是单一的技术,而是一个体系。它解决了三个核心问题:你是谁、你用什么密钥、你的证书是否有效。嗯,咱们今天就把这三个问题拆开看。

PKI 的三大核心角色:CA、RA、VA

一个完整的 PKI 体系,至少有三个角色在背后干活。我当年第一次搭建企业 PKI 时,就把 RA 和 CA 混在一起,结果审计差点没过。

核心关系速记:RA 负责「验明正身」,CA 负责「签发证书」,VA 负责「随时查验」。

  • CA(证书颁发机构)—— 整个体系的信任锚点。它用自己的私钥给用户签发证书。CA 的私钥一旦泄露,整个 PKI 就废了。我记得有个客户把 CA 私钥放在开发服务器上,嗯,那场面……
  • RA(注册机构)—— 相当于 CA 的前台。它负责审核申请人的身份,确认「这个人确实是他声称的那个人」。RA 不直接签发证书,但它的审核结果直接决定 CA 是否签发。
  • VA(验证机构)—— 负责实时查询证书状态。你访问一个 HTTPS 网站,浏览器怎么知道它的证书还没过期?就是通过 VA 提供的 OCSP(在线证书状态协议)或 CRL(证书吊销列表)来查的。

我的经验:小规模 PKI 可以把 RA 和 CA 合并部署,但企业级 PKI 必须分离。我曾经见过一个项目,RA 和 CA 共用一台机器,结果 RA 被攻破后攻击者直接拿到了 CA 的签名权限——教训深刻。

数字证书标准:X.509 v3

X.509 v3 是数字证书的「通用语言」。不管你是 Windows、Linux 还是 macOS,只要遵循这个标准,证书就能互通。我习惯把它比作「数字身份证的模板」。

一个标准的 X.509 v3 证书包含以下关键字段:

字段 说明 我的备注
版本号 目前主流是 v3(值为 2) v1 和 v2 基本淘汰了
序列号 CA 分配的唯一编号 用于吊销时精准定位
签名算法 如 SHA256-RSA 别再用 SHA1 了,不安全
颁发者 签发该证书的 CA 名称 DN 格式,比如 CN=MyCA,O=MyOrg
有效期 notBefore 和 notAfter 我建议证书有效期别超过 2 年
主体 证书持有者的身份信息 可以是个人、服务器或设备
公钥 持有者的公钥信息 包含算法和公钥值
扩展 v3 新增的灵活区域 这才是 v3 的精髓

X.509 v3 的扩展字段特别重要。它让证书不再只是「身份证明」,还能携带用途限制。比如:

  • 密钥用法:指定这个证书的公钥能干嘛——是用于数字签名,还是用于密钥加密?
  • 扩展密钥用法:更细粒度,比如「只能用于 TLS 服务器认证」或「只能用于代码签名」。
  • 基本约束:标记这个证书是不是 CA 证书。如果是,还能限制它签发的下级证书深度。
  • 主体备用名称:这才是 HTTPS 证书的核心——里面列出域名、IP 地址等。

避坑指南:我曾经见过一个项目,给服务器证书配了「密钥加密」用法,但没配「数字签名」用法。结果 TLS 握手时签名验证失败,排查了整整两天。记住:服务器证书通常需要同时开启 digitalSignature 和 keyEncipherment。

证书策略与认证实践声明(CPS)

这两个文档,很多人觉得是「纸上谈兵」。但真正出过事的人都知道,它们就是 PKI 的「宪法」和「操作手册」。

证书策略(CP):定义证书的用途和信任等级。比如:

  • Class 1 证书:只验证邮箱所有权,适合个人
  • Class 3 证书:必须当面验证身份,适合企业
  • 代码签名证书:要求更严格的审核流程

认证实践声明(CPS):CA 具体怎么干活。包括:

  • 私钥怎么生成、存储、备份
  • 证书申请流程和审核标准
  • 证书吊销的条件和流程
  • 审计日志怎么记录和保存

我的习惯:每次搭建 PKI,我都会先写 CPS 再搭系统。因为 CPS 里的每一条操作要求,都会直接影响技术架构设计。比如 CPS 要求「私钥必须存储在 HSM 中」,那你就不能图省事用软件密钥库。

PKI 核心架构图

下面这张图,是我每次培训必画的。它展示了 PKI 各组件之间的信任关系和交互流程。

PKI 核心架构与交互流程 PKI 核心架构与交互流程 根 CA 二级 CA 签发下级证书 RA(注册机构) VA(验证机构) CA(签发机构) 提交审核结果 同步证书状态 终端用户 依赖方 提交申请 签发证书 出示证书 查询状态 说明: RA 负责身份审核,CA 负责证书签发,VA 负责状态查询。三者分离是 PKI 安全的基础。

证书链的信任模型

你想想看,浏览器里预装了上百个根证书。如果每个网站都直接用根证书签名,那根 CA 的私钥一旦泄露,整个互联网都得瘫痪。所以实际用的是证书链。

证书链的结构是这样的:

  1. 根证书:自签名,信任锚点。浏览器预装。
  2. 中间证书:由根证书签发,数量可以有多级。
  3. 终端证书:由中间证书签发,给最终用户使用。

这样做的好处很明显:

  • 根证书的私钥可以离线存储,平时不用
  • 中间证书泄露了,可以单独吊销,不影响根证书
  • 不同用途用不同的中间证书,方便管理

我曾经踩过的坑:部署 HTTPS 时只发了终端证书,没发中间证书。结果安卓手机访问正常,但 Windows 上的老旧浏览器报错「证书链不完整」。因为有些客户端不会自动下载中间证书,你得把完整的证书链一起发过去。

证书吊销机制

证书不是发了就永远有效。私钥泄露、员工离职、域名变更——这些情况都需要吊销证书。主要有两种方式:

方式 原理 优缺点
CRL(证书吊销列表) CA 定期发布一个黑名单 简单,但有延迟,列表会越来越大
OCSP(在线证书状态协议) 实时查询单个证书状态 实时性好,但 CA 需要承受查询压力

我个人更推荐 OCSP Stapling——服务器自己定期去 CA 查询证书状态,然后把结果「钉」在 TLS 握手时发给客户端。这样客户端不用自己去查,既减轻 CA 压力,又保护用户隐私。

配置建议:CRL 的更新周期别超过 24 小时。我见过一个 CA 把 CRL 更新周期设成 7 天,结果证书被吊销后,攻击者又用了整整一周——这周里谁都不知道证书已经废了。

好了,PKI 的骨架就是这样。CA、RA、VA 各司其职,X.509 v3 定义了证书的格式,CP 和 CPS 保证了流程的规范。下一层,咱们就要动手搭建一个真正的 PKI 了。