2、CRL分发机制:HTTP、LDAP、OCSP等分发方式概述

CRL 生成以后,怎么让客户端拿到?这就是分发机制要解决的问题。说白了,就是证书颁发机构(CA)得想个办法,把这张黑名单送到每一个需要校验证书的地方。

我见过不少团队,crl 明明更新了,客户端却还在用一周前的旧列表。原因多半是分发方式没选对,或者配置有坑。这章我们就来把 HTTP、LDAP、OCSP 三种主流方式捋一遍。

2.1 为什么要搞这么多分发方式?

你想想看,一个大型 PKI 环境里有成百上千种客户端:Web 浏览器、邮件客户端、VPN 网关、移动设备……它们的网络环境、性能要求、离线策略都不一样。CA 不能指望用一种方式满足所有人。

我习惯把三种方式按照「工作量」和「实时性」排个序:

  • HTTP 下载:最简单,但客户端每次都要拉取整个列表,流量大。
  • LDAP 查询:可以增量查,但依赖目录服务,配置稍复杂。
  • OCSP 在线查询:最实时,只查单个证书状态,但需要 CA 在线响应。

核心原则:CRL 分发方案没有银弹。生产环境通常同时启用两种以上方式,比如 HTTP 全量兜底 + OCSP 实时查。

2.2 HTTP 方式—— 最直白,也最容易出问题

CA 把 CRL 文件放到一个 Web 服务器上,客户端通过 CRL Distribution Point 扩展里的 URL 去下载。常见的 URL 长这样:

http://crl.example.com/root.crl
http://crl.example.com/intermediate.crl

客户端拿到文件后,验证签名,然后缓存起来直到下次更新。

优点:实现简单,几乎任何语言都能写个 wget 搞定。

缺点:

  • 全量下载:一个大的 CRL 可能有几十 MB,手机端流量受不了。
  • 缓存策略:客户端可能缓存了过期列表。我曾遇到过某浏览器缓存了 7 天的 CRL,导致被撤销的证书还能用一周。
  • 单点故障:如果服务器挂了,客户端就下不到新列表,只能沿用旧数据。

注意:CDP 里的 URL 必须是 http:// 或者 https://。如果是 https,客户端还得验证分发点的证书,形成循环依赖——你细品。

2.3 LDAP 方式—— 企业内网的老伙计

LDAP(轻量级目录访问协议)可以存储并查询 CRL。客户端不需要下载整个文件,而是通过 LDAP 搜索过滤器直接获取某个 CA 的最新 CRL。

配置项目中,我经常看到这样的 LDAP 路径:

ldap://ldap.example.com/cn=RootCA,o=Example,c=US?certificateRevocationList?base

这里面指定了目录的 DN(Distinguished Name),以及要读取的属性 certificateRevocationList。

优点:

  • 支持增量更新:LDAP 可以只返回 CRL 的变更部分(如果目录支持增量同步)。
  • 与已有企业 LDAP 集成:不用额外搭 Web 服务器。

缺点:

  • 协议较复杂,防火墙经常拦 LDAPS(636 端口)。
  • 性能瓶颈:大量并发 LDAP 查询可能拖垮目录服务器。

我的经验:有一次客户反馈 CRL 下载慢,查了半天发现是 LDAP 的 Size Limit 设得太小,CRL 条目数超了阈值,服务器直接返回空列表。记得检查目录服务器的限制参数。

2.4 OCSP—— 最实时,但有成本

OCSP(Online Certificate Status Protocol)不像 CRL 那样要下载列表。客户端只问某个证书:这个证书现在 revoked 了吗? 服务器回答:good / revoked / unknown。一个请求才几百字节,非常轻量。

一个典型的 OCSP 请求(DER 编码后)大概这样:

OCSPRequest ::= SEQUENCE {
    tbsRequest      TBSRequest,
    optionalSignature [0] EXPLICIT Signature OPTIONAL
}

实际开发的工欲善其事,我用 OpenSSL 模拟:

openssl ocsp -issuer ca.pem -cert target.pem -url http://ocsp.example.com -text

优点:

  • 实时性最高,几秒内就能知道证书状态。
  • 流量极小,适合移动端。

缺点:

  • CA 必须时刻在线,提供 OCSP 响应服务。
  • 隐私问题:CA 能知道你在查询哪个证书(相当于知道你的访问记录)。
  • OCSP 响应需要签名,每次都要加解密,CA 服务器压力大。

注意:苹果和 Android 近年都在推动 OCSP Must-Staple,要求服务器在 TLS 握手时就把 OCSP 响应带过来,避免客户端再单独去查浪费流量。这个机制叫 OCSP Stapling。

2.5 三种方式对比

我习惯用下表来给团队做方案选型参考:

特性 HTTP / HTTPS LDAP OCSP
获取方式 全量下载 CRL 文件 目录查询,可增量 单个证书状态查询
实时性 低(取决于更新间隔) 中 高(秒级)
网络流量 大(全量) 中 极小
客户端缓存 支持(但易过期) 支持 不强制缓存
服务器依赖 Web 服务器即可 LDAP 目录服务 OCSP 响应器(需签名密钥)
隐私保护 弱(IP 可追踪) 中 弱(CA 知道你在查谁)
配置复杂度 低 中 高(签名、证书管理等)
适用场景 Web 服务器、公共 CA 企业内网、AD 集成 移动端、高安全场景
CRL 分发机制总览 CA 签发 CRL HTTP 文件服务器 LDAP 目录服务 OCSP 响应器 全量下载 客户端拉取整个 CRL 文件 需缓存,更新有延迟 增量查询 支持属性过滤 需 LDAP 基础架构 实时单条查询 只查一个证书状态 CA 必须在线签名 客户端(浏览器/应用)

2.6 实际项目怎么选?

我给个实际决策思路,你以后做架构时可以套用:

  1. 先看客户端类型:Web 浏览器默认支持 HTTP CRL + OCSP;企业自研 App 可以选 OCSP 或 LDAP。
  2. 再看网络环境:内网推荐 LDAP,公网推荐 HTTP + OCSP Stapling。
  3. 最后看 CA 负载能力:如果 CA 服务器配置低,别开 OCSP,乖乖用 HTTP CRL 做缓存。

我曾经帮一家银行做 PKI 升级,他们一开始只配了 LDAP,结果全国网点同时查询,目录服务器直接崩了。后来改成 HTTP CRL 为主、LDAP 兜底,问题解决。记住:任何分发方式都要做 容量规划。