证书管理:自签名、CA申请、吊销与轮换

证书管理这事儿,说白了就是给API网关发“身份证”并保证它不过期、不被冒用。我在多个网关项目里都发现,很多团队只关注证书怎么生成,却忽略了吊销和轮换——结果线上突然证书过期,整条链路全断。

嗯,这一节我们把这四块掰开揉碎了讲清楚。

自签名证书生成

自签名证书就是自己当CA。适合开发、测试环境,或者内部服务之间的互相调用。我在早期项目里就吃过亏:自签名证书没配完整信任链,客户端死活不认。

生成一个自签名证书,通常用 OpenSSL。我习惯这么写:

# 生成私钥(RSA 2048位)
openssl genrsa -out mykey.pem 2048

# 生成证书签名请求(CSR)
openssl req -new -key mykey.pem -out myreq.csr -subj "/CN=myapi.example.com"

# 自签名
openssl x509 -req -days 365 -in myreq.csr -signkey mykey.pem -out mycert.pem

注意几个坑:
- CN 必须填域名或IP,客户端校验时靠它。
- -days 别太短,我见过有人设7天,然后天天被轮换折腾。
- 自签名证书的 签发者 等于 主体,所以浏览器会弹出安全警告。

重要提醒:生产环境不要用自签名证书!不仅不安全,而且客户端难以信任,一旦出问题定位极难。

CA证书申请

生产环境必须走正规CA(证书颁发机构)。流程分两步:生成CSR,提交给CA,拿回签发的证书。

我自己常用的命令:

# 生成私钥(ECC 更轻量,推荐)
openssl ecparam -genkey -name prime256v1 -out server.key

# 生成CSR
openssl req -new -key server.key -out server.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=api.example.com"

然后把 server.csr 提交给CA(比如 Let's Encrypt、DigiCert)。CA会验证你对该域名的控制权(通过DNS或HTTP挑战)。

拿到CA签发的证书后,别忘了检查:

小贴士: 用 openssl x509 -in server.crt -text -noout 查看证书细节,确认签发者和有效期。我曾经被坑过一次——CA给的证书链少了一级中间CA,导致客户端握手失败。

证书吊销

证书被泄露或私钥丢失,必须立刻吊销。吊销机制主要有两种:

  • CRL(证书吊销列表) — CA定期发布黑名单,客户端去下载更新。
  • OCSP(在线证书状态协议) — 实时查询单个证书状态,响应更快。

为什么吊销重要?你想想看,如果攻击者拿到了你的证书私钥,他就能伪装成你的API网关。不吊销,光改密码没用。

CA一般提供吊销接口。以 Let's Encrypt 为例,用其客户端工具直接吊销:

certbot revoke --cert-path /etc/letsencrypt/live/api.example.com/cert.pem

吊销后,要立刻生成新证书并部署。同时把旧证书加入网关的黑名单——哪怕客户端信任的CA还没更新CRL,网关自己可以拒绝旧证书。

避坑指南: 我曾经有一次只吊销了证书,忘了更新网关的信任存储。结果旧证书还能访问了整整两天,因为客户端缓存了OCSP响应。所以吊销后,务必立即刷新网关侧的认可列表。

证书轮换策略

证书有有效期,到期前必须轮换。手动轮换容易出错,我建议自动化。频率上,Let's Encrypt 证书90天有效,我用cron每周检查一次。

轮换策略的核心原则:

  • 提前轮换 — 在过期前至少7天完成。我习惯提前30天。
  • 平滑切换 — 新证书先和旧证书并存,等所有客户端都握手成功后再下线旧证书。
  • 监控告警 — 证书过期时间作为指标接入Prometheus,到期前14天发送告警。

一个简单的轮换脚本示例(基于Let's Encrypt):

#!/bin/bash
# 检查证书是否将在30天内过期
if openssl x509 -checkend $((30*24*3600)) -in /path/to/cert.pem; then
    echo "证书有效,无需轮换"
else
    certbot renew --quiet --deploy-hook "systemctl reload nginx"
    echo "证书已更新,重载服务"
fi

嗯,这里要注意:轮换后一定要验证服务是否正常。比如用curl带证书测试:

curl --cacert /path/to/ca.pem --cert /path/to/newcert.pem --key /path/to/newkey.pem https://api.example.com/health

核心总结: 证书管理不是“生成一次就完事”。自签名用于开发,CA用于生产;吊销要在泄露时立刻执行;轮换要自动、提前、平滑。这三者配合起来才能保证API网关的加密通道始终安全可靠。

证书生命周期全景

下面我用一张图展示自签名、CA申请、吊销、轮换四步之间的关系。请注意图中箭头方向代表流程走向。

证书生命周期管理流程 生成私钥 & CSR OpenSSL 或工具 自签名 仅开发/测试 CA 证书申请 生产环境 部署到网关 nginx / Kong / Envoy 监控有效期 Prometheus 告警 证书吊销 泄露/过期前 轮换新证书 自动 + 平滑 注意:吊销与轮换是互斥决策——泄露时吊销,到期前轮换,不能混淆

图中的虚线表示轮换完成后,新证书重新进入“部署到网关”阶段,形成一个持续循环。自签名和CA申请是两条不同的前期路径,但后续的监控、吊销、轮换逻辑是一致的。