当我们讨论 HTTPS 安全性时,证书吊销检查是一个常被忽视但至关重要的环节。传统的 OCSP(Online Certificate Status Protocol)存在隐私和性能问题,Mozilla 提出的 CRLite 提供了一种更优的解决方案。本文将深入探讨 CRLite 的设计原理、与 OCSP 的对比,以及如何在实际环境中应用。

传统 OCSP 的问题

在了解 CRLite 之前,我们先回顾一下传统 OCSP 面临的挑战:

1. 隐私泄露

OCSP 请求会直接向 CA 的 OCSP 服务器发送请求,这会暴露用户的浏览行为。攻击者可以通过监控 OCSP 请求来确定用户正在访问哪些网站。

1
2
# 模拟 OCSP 请求
openssl s_client -connect example.com:443 -status 2>/dev/null | grep -A 10 "OCSP response"

2. 性能瓶颈

每次建立 HTTPS 连接时,客户端都需要额外查询 OCSP 服务器,这增加了握手延迟。如果 OCSP 服务器响应缓慢,会直接影响用户体验。

1
2
3
# 测试 OCSP 响应状态(使用 timeout 防止卡住)
timeout 5 openssl s_client -connect ocsp.digicert.com:443 -servername ocsp.digicert.com \
    -status </dev/null 2>&1 | grep "OCSP response" || echo "OCSP query timed out or unavailable"

3. 可靠性问题

OCSP 服务器可能不可用(宕机、网络问题),此时客户端需要等待超时,这会导致连接建立延迟。

4. 撤销状态延迟

CA 可能需要数小时甚至数天才能将吊销的证书发布到 OCSP 响应中,这段时间内恶意证书仍被信任。

CRLite 工作原理

CRLite(Certificate Revocation List Lite)是一种批量更新的证书吊销检查系统,它通过定期下载并维护一个压缩的证书吊销列表来解决上述问题。

核心设计

  1. 批量更新:CRLite 不是实时查询,而是定期(通常每天)生成一个包含所有已吊销证书的增量更新包。

  2. 布隆过滤器:使用布隆过滤器存储吊销证书的序列号,节省存储空间。

1
2
3
# 布隆过滤器示例:高效的集合成员检查
# 如果证书序列号在布隆过滤器中不存在,则一定未吊销
# 如果存在,则需要进一步验证
  1. 完全隐私:用户下载的是公共的吊销列表,不向任何服务器暴露具体访问的网站。

  2. 级联过滤器:CRLite 使用两级过滤器设计,第一级是布隆过滤器,第二级是精确匹配的结构,确保低误报率。

更新流程

1
CA 吊销证书 → Mozilla 收集 → 生成增量更新 → 用户下载 → 本地验证

Firefox 每天会自动下载 CRLite 更新包,并在后台进行验证。用户访问网站时,可以直接本地检查吊销状态,无需网络请求。

CRLite 与 OCSP 对比

特性 OCSP CRLite
隐私保护 ❌ 暴露访问记录 ✅ 完全隐私
实时性 ✅ 实时查询 ⚠️ 批量更新(延迟)
性能 ❌ 额外网络延迟 ✅ 本地快速检查
可靠性 ❌ 依赖服务器 ✅ 离线可用
带宽消耗 较高(完整列表)

服务器端配置

虽然 CRLite 主要是客户端功能,但服务器端可以通过以下方式优化兼容性:

1. 支持 OCSP Stapling

确保服务器配置了 OCSP Stapling,让客户端可以直接获取吊销状态:

1
2
3
4
5
# Nginx 配置示例
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

2. 配置 CRL 分布点

在证书中包含 CRL 分布点,便于使用 CRL 的客户端:

1
2
# 查看证书的 CRL 分布点
openssl x509 -in certificate.pem -noout -text | grep -A 2 "CRL Distribution"

3. 启用证书透明度

虽然不是 CRLite 的一部分,但启用 CT 有助于快速发现异常证书:

1
2
# 检查证书的 CT 预证书
openssl x509 -in certificate.pem -noout -text | grep -A 5 "CT Precertificate"

验证 CRLite 状态

目前,Firefox 是主要支持 CRLite 的浏览器。你可以通过以下方式验证:

1. 检查 Firefox 证书日志

Firefox 会在内部日志中记录 CRLite 检查结果。在 about:networking 中可以查看详细信息。

2. 使用 OpenSSL 模拟检查

虽然 OpenSSL 不直接支持 CRLite,但可以模拟类似逻辑:

1
2
# 模拟 CRL 检查(需要真实的 CRL URL)
# openssl crl -in http://crl.example.com/ca.crl -inform DER -noout -text

CRLite 的局限性

  1. 更新延迟:由于是批量更新,新吊销的证书可能需要等待下一次更新才能被检测到。

  2. 存储开销:完整的吊销列表需要一定存储空间,对低端设备可能有影响。

  3. 部署范围:目前主要由 Firefox 使用,其他浏览器尚未广泛采用。

最佳实践建议

对于网站管理员:

  1. 及时吊销:发现私钥泄露后立即联系 CA 吊销证书。

  2. 配置双重检查:同时启用 OCSP Stapling 和 CRL 分布点,支持多种客户端。

  3. 监控证书状态:使用自动化工具监控证书状态变化。

1
2
3
4
# 使用 openssl 检查证书状态(OCSP)
# 替换 yoursite.com 为实际域名
timeout 5 openssl s_client -connect yoursite.com:443 -status </dev/null 2>&1 | \
    grep -A 10 "OCSP Response Status" || echo "OCSP check unavailable"
  1. 考虑短期证书:使用短期证书(如 90 天)可以减少吊销检查的依赖。

总结

CRLite 是 Mozilla 为解决传统 OCSP 隐私和性能问题而提出的创新方案。它通过批量更新和本地验证的方式,在保护用户隐私的同时提供了更可靠的证书吊销检查。虽然目前部署范围有限,但它代表了证书吊销检查的未来方向。

作为网站管理员,我们应该:

  • 理解证书吊销检查的重要性
  • 配置好 OCSP Stapling 以支持传统客户端
  • 关注 CRLite 等新技术的发展
  • 及时响应安全事件,快速吊销受损证书

参考来源