CA 系统架构与日志产生位置

做 CA 运维这些年,我最深刻的体会就是——日志在哪,答案就在哪。你想想看,一个证书签发出问题了,用户说「我提交了 CSR 但拿不到证书」,你第一反应肯定是去查签发服务的日志。但签发服务的日志在哪?它在整个 CA 架构里处于什么位置?这要是搞不清楚,排查起来就像没头苍蝇。

这一节,咱们就把 CA 的四大核心组件——签发服务(CA 服务器)、OCSP 响应器、CRL 发布点和RA 注册机构——的日志产生点彻底捋一遍。我会告诉你每个组件在什么时机写日志、写什么内容、日志通常存在哪里。

CA 整体架构图:日志从哪里来?

先看一张总图。这张图里每个方块都是一个会产生日志的组件,箭头代表日志流向或业务流转方向。我个人习惯把这张图贴在工位旁边,每次排错先对着它定位位置。

CA 系统组件与日志产生点 RA 注册机构 日志:注册请求、身份验证、审核 CA 签发服务 日志:CSR、签发、密钥生成、续签 OCSP 响应器 日志:请求、响应、状态查询 CRL 发布点 日志:生成、发布、分发点访问 日志存储/采集 syslog / 文件 / 数据库 提交 CSR 同步证书状态 推送 CRL 日志汇聚 ✏️ 每条日志应包含:时间戳、组件名、 事件类型、请求ID、结果状态码

1. CA 签发服务 — 日志最密集的地方

签发服务是 CA 的心脏。所有证书的生命周期操作都要经过它。我记得有一次某客户的证书批量申请失败,查了两天发现是签发服务的日志轮转把旧日志覆盖了,关键错误信息被冲掉了。从那以后,我对签发服务的日志采集格外敏感。

日志产生点主要有这些:

  • 接收 CSR 时:记录请求来源 IP、CSR 指纹、公钥算法、请求 DN。
  • 身份验证时:记录验证方式(密码 / 证书 / 令牌)、验证结果。
  • 密钥对生成时:如果由 CA 生成密钥对,会记录密钥类型、长度、存储标识。
  • 证书签发时:记录序列号、主题、签发者、有效期、扩展项(SAN、EKU)。
  • 证书续签时:记录原证书序列号、续签原因、新旧指纹对比。
  • 证书吊销时:记录吊销原因、吊销时间、操作管理员。

我的个人经验:签发服务的日志字段一定要包含 request_id 或 transaction_id。没有这个 ID,你根本没法把 CSR 请求和签发的证书关联起来。我曾经在一个金融客户现场,就因为日志里没有关联字段,排查一个「证书已签发但客户端拿不到」的问题花了整整一个下午。

典型的签发日志条目(参考格式):

2025-03-15 14:23:18.456 [CA-SIGN] INFO  cert_issue::handler - 
  RequestID=REQ-2025-0315001, 
  CSR_Fingerprint=sha256$A1B2C3..., 
  Subject="CN=api.example.com,OU=IT,O=ACME",
  Serial=0x1A2B3C4D5E,
  Status=ISSUED,
  Validity=2025-03-15/2026-03-15,
  Duration=4ms

2. OCSP 响应器 — 在线状态查询日志

OCSP 的作用是让客户端实时查询证书是否被吊销。日志相对简单,但并发量可能巨大——尤其是在高流量场景下。

关键日志点:

  • 收到 OCSP 请求(记录来源 IP、请求证书序列号、哈希算法)。
  • 查询本地状态数据库(记录命中/未命中、数据库响应时间)。
  • 返回 OCSP 响应(记录响应状态:good / revoked / unknown、签名算法)。
  • 签名失败或数据库异常(记录具体错误码)。

避坑指南:OCSP 日志很容易因为请求量太大而撑爆磁盘。我曾经在部署时没有限流,结果 OCSP 的日志文件一天涨了 20GB,最后把系统盘写满了。建议你一定要给 OCSP 日志单独分区,并设置合理的轮转策略(比如按小时滚动)。

2025-03-15 14:25:01.123 [OCSP] INFO  ocsp_handler::process - 
  ClientIP=192.168.1.100,
  Serial=0x1A2B3C4D5E,
  HashAlgo=SHA256,
  Status=REVOKED,
  RevocationTime=2025-03-10T08:00:00Z,
  ResponseTime=3ms

3. CRL 发布点 — 定期更新日志

CRL(证书吊销列表)是 CA 定期生成的一份被吊销证书的清单。它的日志产生频率比 OCSP 低得多,但每次发布的数据量很大。

日志产生点:

  • CRL 生成触发:记录触发方式(定时 / 手动 / 吊销事件触发)。
  • CRL 数据组装:记录本次包含的吊销证书数量、下次更新时间。
  • CRL 签名:记录使用的签名证书标识、签名算法。
  • CRL 发布:记录发布目标路径(文件系统 / HTTP / LDAP)、文件大小。
  • CRL 分发点访问:记录下载请求来源、请求的文件名、请求结果(成功/失败)。

有个细节:很多人只关注 CRL 是否生成成功,却忘了检查 CRL 的「下一次更新」时间是否合理。如果这个时间被错误地设置到了过去,所有客户端都会认为 CRL 已过期而拒绝信任证书——我在项目里帮客户排查过这种「一朝回到解放前」的惨案。

4. RA 注册机构 — 前端业务的日志枢纽

RA 通常部署在企业内部,负责审核用户身份并转发 CSR 给 CA。日志偏向业务操作和审计。

主要日志点:

事件类型日志内容典型字段
注册请求用户提交证书申请,包含个人信息、组织信息UserID, Email, Dept, RequestTime
身份验证验证用户身份(如 AD 登录、短信验证码)AuthMethod, AuthResult, AuthProvider
审核操作管理员批准/拒绝证书申请Operator, Action, Reason, ApprovalTime
流程状态变更申请流程在各环节流转FromStatus, ToStatus, Duration
2025-03-15 14:30:55.789 [RA-AUDIT] INFO  ra_workflow::approve - 
  RequestID=REQ-2025-0315001,
  Operator=zhangsan@corp.com,
  Action=APPROVED,
  SubjectDN="CN=api.example.com",
  PreviousStatus=PENDING,
  CurrentStatus=APPROVED,
  Comment="业务需要,审核通过"

RA 日志还有一个重要作用——审计合规。金融、政务场景下,RA 的审核日志必须保留至少 5 年,并且做到不可篡改。我见过很多厂商直接在 RA 日志上叠加区块链哈希链,就是为了满足监管要求。

各组件日志特点对比

组件日志量级关键关注点常见存储路径
CA 签发服务中等(每分钟数百~数千条)序列号唯一性、签名耗时、异常码/var/log/ca/sign/*.log
OCSP 响应器高(可能每秒上万条)响应时间、状态命中率、错误率/var/log/ca/ocsp/*.log
CRL 发布点低(每天几次到几十次)发布完整性、下次更新时间、分发点可达性/var/log/ca/crl/*.log
RA 注册机构低~中等(与业务申请量成正比)审计追溯、流程时间线、操作合规/var/log/ca/ra/*.log

日志采集前你要想清楚的事

嗯,这里我要多啰嗦两句。很多新手一上来就想着「我要把所有日志都采集到 ELK 里」,结果被 OCSP 的日志洪水冲垮了 Kafka 集群。

  • 分优先级:CA 签发日志必须实时采集(<1s 延迟),OCSP 可以延迟 1-2 分钟聚合上传,CRL 和 RA 日志可以按小时批量同步。
  • 注意时间同步:所有组件的系统时间必须 NTP 对齐。我遇到过一台 CA 服务器时间慢了 3 分钟,导致 OCSP 响应里显示的状态时间戳和实际吊销时间错位,客户投诉「证书被吊销了 OCSP 还说 good」。
  • 日志格式统一:尽量采用 JSON 或结构化文本,字段名保持一致。最好在日志配置里就写好模板,不要靠后处理去猜字段。