1. PKI基础回顾:数字证书、CA中心、证书链的概念与作用

各位同学好。咱们这门课讲的是CRL和OCSP,说白了就是怎么查证书有没有被吊销。但在动手之前,我觉得有必要先把PKI的基础再过一遍。你可能会说:“这些我都知道啊。”——嗯,我理解。但我在项目里见过太多人,就是因为基础概念没吃透,结果排查证书问题时绕了一大圈。

所以这一章,咱们把数字证书、CA中心、证书链这三个东西彻底捋清楚。我保证,不会讲成教科书式的枯燥定义,而是结合我踩过的坑来讲。

1.1 数字证书:到底是个什么东西?

数字证书,很多人叫它“证书”或“公钥证书”。它本质上就是一个电子身份证。

你想想看,现实生活中你拿身份证证明“我是我”。在网络上,服务器拿证书证明“我是合法的服务器”。证书里绑定了公钥和身份信息,并且由权威机构做了数字签名。

一个标准的X.509 v3证书,里面包含哪些关键字段?我列个表,你对照着看:

字段 含义 我的备注
版本号 (Version) 通常是v3 (值为2) v3才支持扩展项,比如CRL分发点
序列号 (Serial Number) CA分配给证书的唯一编号 吊销时就是靠这个号来找证书
签名算法 (Signature Algorithm) 如SHA256WithRSA CA用这个算法给证书签名
颁发者 (Issuer) 签发该证书的CA名称 DN格式,比如CN=MyCA, O=MyOrg
有效期 (Validity) notBefore 和 notAfter 过期证书直接不信任,不用查吊销
主体 (Subject) 证书持有者的身份 服务器证书通常是域名
公钥 (Subject Public Key Info) 持有者的公钥 这是证书最核心的价值
扩展项 (Extensions) v3新增的附加信息 CRL分发点、OCSP响应器地址都在这里
一个小技巧: 我习惯用 openssl x509 -in cert.pem -text -noout 来查看证书的完整内容。尤其是扩展项里的 CRL Distribution Points 和 Authority Information Access,这两个字段直接决定了客户端去哪里查吊销状态。后面几章我们会反复用到。

1.2 CA中心:谁来发证书?

CA(Certificate Authority),就是证书颁发机构。它负责签发、管理和吊销证书。

CA中心不是随便谁都能当的。它必须被客户端信任。怎么信任?客户端的信任存储区里预置了CA的根证书。比如你的浏览器里就内置了几十个全球公认的根CA证书。

CA分两种:

  • 公共CA:比如DigiCert、Let's Encrypt。给互联网上公开的网站发证书。需要付费或通过自动化验证。
  • 私有CA:企业内部自己搭的。比如用OpenSSL或微软AD CS搭建。只给内部系统用,不对外公开。

我记得有一次帮一家金融客户排查问题。他们的内部系统之间做TLS双向认证,但客户端总是报“证书不可信”。查了半天,发现是客户端没有导入私有CA的根证书。你看,CA的信任关系一旦断了,整个PKI就玩不转。

注意: 私有CA签发的证书,在公网上默认不被信任。如果你把私有CA的证书部署到对外服务的服务器上,用户访问时会看到“不安全”的警告。我曾经见过有人把自签名证书用在生产环境的API网关上,结果第三方对接方死活连不上——这就是典型的信任链断裂。

1.3 证书链:信任是怎么传递的?

证书链,也叫信任链。它解决了一个问题:我怎么相信一张证书是合法的?

答案很简单:一层一层往上查,直到找到一个你信任的根。

典型的证书链有三层:

  1. 根证书 (Root CA):自签名的。它是信任的锚点。客户端必须预置它。
  2. 中间证书 (Intermediate CA):由根CA签发。它负责给终端实体发证书。这样做的好处是,根CA可以离线保存,更安全。
  3. 终端实体证书 (End Entity / Leaf):就是服务器或客户端实际使用的证书。由中间CA签发。

验证过程是这样的:

  • 客户端拿到服务器证书(叶子证书)。
  • 检查签发者是谁,找到中间CA证书。
  • 用中间CA的公钥验证叶子证书的签名。
  • 再检查中间CA的签发者,找到根CA证书。
  • 用根CA的公钥验证中间证书的签名。
  • 根CA是自签名的,客户端信任它(因为预置了)。
  • 验证通过,信任建立。

这个过程,我画了一张图,你一看就明白:

证书链信任验证流程 根CA证书(信任锚) 中间CA证书 服务器证书(叶子) 客户端预置,自签名 信任的起点 由根CA签发 负责签发叶子证书 由中间CA签发 实际使用的证书 ① 用根CA公钥 验证中间CA签名 ② 用中间CA公钥 验证叶子证书签名 ③ 验证通过,建立信任

在实际部署中,服务器需要把完整的证书链(叶子证书 + 中间证书)发给客户端。如果只发叶子证书,客户端找不到中间证书,验证就会失败。我遇到过好几次,运维人员只配置了服务器证书,没配中间证书,结果手机App死活连不上——这就是典型的“证书链不完整”问题。

1.4 为什么证书链这么重要?

证书链的设计,解决了几个关键问题:

  • 安全性:根CA可以离线保存,即使中间CA被攻破,根CA还在,可以吊销中间CA证书,重新签发。
  • 灵活性:一个根CA可以签发多个中间CA,每个中间CA负责不同的场景(比如一个给Web服务器用,一个给代码签名用)。
  • 可扩展性:全球几十亿张证书,不可能都由一个根CA直接签发。分层结构让CA体系可以无限扩展。

核心要点: 证书链的本质是信任的传递。从你信任的根开始,一层一层签名下去,最终信任叶子证书。任何一环断了,信任就不成立。而CRL和OCSP,就是在验证过程中额外加的一道保险——检查证书有没有被提前吊销。