CRL 分发接口概述

聊到 CRL 分发,其实就是解决一个问题:客户端怎么拿到最新的吊销列表。你想想看,一个 PKI 体系里可能有成千上万个终端,每个终端都要定期拉取 CRL,这个接口设计不好,整个系统都得崩。

我个人习惯把分发方式分成三大类:HTTP、LDAP 和 SCVP。每种的脾气秉性都不一样,用得不对,坑不少。

常见分发方式

HTTP 分发 — 简单粗暴

说白了,就是把 CRL 文件搁在 Web 服务器上。客户端发个 GET 请求就能下载。CRL Distribution Point 扩展里写的就是一个 URL:

http://crl.example.com/ca.crl

优点很明显:技术门槛低,谁都会配。但缺点也很突出——实时性差。

我曾经遇到过一个客户,CRL 文件超过 10 MB,全公司 5000 台终端每隔 1 小时拉一次。结果呢?出口带宽被打满,业务部门投诉网络慢得像蜗牛。后来切了增量分发才解决问题。

我建议你注意以下几点:

  • 文件大小:CRL 太大就切分,或者用 Delta CRL
  • 缓存策略:Cache-Control 和 Expires 头部要配好
  • CDN 加速:跨地域分发的话,上 CDN 能缓解不少压力

LDAP 分发 — 目录服务专享

如果你已经有 LDAP 目录服务,用 LDAP 来分发 CRL 是很自然的选择。客户端通过 ldap:// 协议去查询:

ldap://ldap.example.com/cn=CA,dc=example,dc=com?certificateRevocationList;binary
项目小贴士:LDAP 查询支持属性过滤,你可以只取增量数据,不用每次下载整个 CRL。

不过,LDAP 也有它的毛病:端口争议。标准 LDAP 是 389,但很多 PKI 产品却绑定在非标准端口上。这个坑我踩过好多次,部署前一定确认清楚。

SCVP — 把活甩给别人

SCVP(简单证书验证协议)就是个代理。客户端不直接拿 CRL,而是把验证请求丢给 SCVP 服务器,服务器帮你查完再给结论。

优点:客户端啥都不用管,适合瘦终端或移动设备。但坏处是引入了一个新角色,系统复杂度上去了。

我记得有一次在一个政务项目里,终端设备性能太差,连解析 CRL 的 ASN.1 都费劲。最后上了 SCVP,瞬间轻松了。

接口设计原则

不管用哪种分发方式,接口设计有四个原则必须守住。

  1. 幂等性:同样的请求发 10 次,结果必须一样。CRL 获取是典型的读操作,必须幂等
  2. 流式传输:CRL 文件可能很大,不要一次性全部加载到内存,要支持 chunked 或 range
  3. 缓存友好:服务端要返回 Last-Modified 和 ETag,客户端要做 If-Modified-Since 判断
  4. 可重试与退避:网络是不可靠的,客户端要有重试逻辑,而且必须用指数退避,别搞个死循环把服务端拖垮
核心要点:
幂等性 — 保证安全
流式传输 — 应对大文件
缓存友好 — 降低带宽消耗
可重试退避 — 防止雪崩

三种方式对比

特性 HTTP LDAP SCVP
部署复杂度 低 中 高
实时性 中 中 高
缓存能力 强 中 弱
协议开销 低 中 高
适用场景 互联网/公网 内网/企业目录 移动/受限终端

知识体系图:CRL 分发接口架构

CRL分发接口架构图 CRL 发行点 HTTP 分发 LDAP 分发 SCVP 分发 终端 / 客户端 接口设计原则:幂等性 · 流式传输 · 缓存友好 · 可重试与退避

对,这张图就是三种分发方式与终端的关系。你仔细看——CRL 发行点是数据源头,经过 HTTP/LDAP/SCVP 三道代理,最后落到客户端。接口设计原则就像地基,上面盖什么都稳。

安全加固小提醒

最后多说一句,接口要上 TLS。你想想,如果 CRL 在网络传输中被篡改,客户端拿到错误的吊销列表,后果可能就是放行一个已被吊销的证书。

我曾经亲眼见过一个系统,HTTP 明文分发 CRL,中间人攻击后插入了假 CRL。后来统计有 3 个不该信任的证书被 ACCEPT 了。教训惨痛。

所以,不管用 HTTP 还是 LDAP,传输层加密必须做。接口层面再加个数字签名验证,双重保险。