结论:CA/Browser Forum 已经确定了证书有效期缩短的时间表,2026 年 3 月 15 日起,公共 SSL/TLS 证书最长有效期先从 398 天直接压到 200 天,2027 年 3 月 15 日压到 100 天,2029 年 3 月 15 日压到 47 天。运维要做的唯一正确应对是把“到期前人工续签”改成“ACME 自动签发 + 分级告警 + 异常人工兜底”,并且在 2026 年 3 月前完成改造,不是去准备更勤快的续签日历。
SSL 证书有效期缩短到多少天了?
结论:有效期分三步下调,并同时压缩域名验证数据的复用期;留给人工操作的窗口越来越小。
| 生效日期 | 单张证书最长有效期 | 域名验证数据复用期 |
|---|
| 2026-03-15 | 200 天 | 200 天 |
| 2027-03-15 | 100 天 | 100 天 |
| 2029-03-15 | 47 天 | 10 天 |
背景补充:2020 年 9 月 1 日起,公共证书上限就已经从 825 天(苹果 Safari 强制的 398 天)统一到 398 天。表单里的“复用期”指 CA 完成一次域名所有权验证后可以重复签发的时间,它和有效期同步缩短,这意味着“一次性验证、长期复用”的老办法也会失效,DV 验证也必须自动化。
47 天有效期为什么逼着运维改流程?
结论:证书数量一多,人工续签的频次会超出人力承受上限,必须具备自动续签能力。
按 300 张证书(含主域名、泛域名、测试、内网对外暴露服务)估算:
- 398 天周期:每年签发约 275 次,平均每天不到 1 次,人工可以扛住。
- 100 天周期:每年签发约 1095 次,平均每天 3 次。
- 47 天周期:每年签发约 2330 次,平均每天 6.4 次。
如果按剩余 1/3 有效期时续签(ACME 客户端的默认策略),47 天证书每 15~16 天就要轮换一轮。任何一个“等明天再处理”的工单,都会在两周内再回来一次。这个频次下,人工流程的维护成本高于自动化改造的投入成本。
第一步怎么把证书资产盘清楚?
结论:先有台账再谈自动化,漏掉的那张证书一定会在半夜过期。
具体做法:
- 从反向代理、负载均衡、CDN、K8s Ingress、API 网关配置里导出全部证书路径,不要只查 Nginx。
- 对全部对外 IP 段扫描 443/8443/9443 端口,拿回证书的 CN/SAN、签发者、到期时间。
- 用 CT 日志反查:在 crt.sh 搜索
%.yourdomain.com,能发现被遗忘的子域名证书。
- 单独标注三类高风险资产:泛域名证书、非 443 端口服务、IoT/老系统里写死证书路径的服务。
- 台账字段至少包含:域名、证书路径、私钥路径、签发方式(ACME/商业 CA/自签)、关联服务、责任人。
怎么用 ACME 把续期自动化?
结论:公共证书统一走 ACME 协议(自动证书管理环境,一套让客户端自动向 CA 申请、续期、部署证书的标准协议),用 DNS-01 验证签泛域名,用 deploy-hook 完成证书重载。
- Nginx/Apache 单机:
certbot renew --deploy-hook "systemctl reload nginx",用 systemd timer 每天跑两次,先执行 certbot renew --dry-run 验证演练通道可用。certbot 默认在剩余 30 天时续签,47 天证书下这个阈值偏晚,建议改成 --renew-hook 配合 renew_before_expiry = 20 days。
- 泛域名:必须用 DNS-01,把 DNS API 凭据交给客户端(如 Cloudflare、阿里云 DNS 插件),不要用 HTTP-01 手动放验证文件。
- Kubernetes:用 cert-manager,在 Certificate 资源里显式设置
renewBefore: 720h(47 天证书下调到 240h 左右),Issuer 用 ACME + DNS-01。
- 反向代理层:Caddy 默认全自动签发续期,Traefik 打开
certificatesResolvers 即可,适合新项目直接选型。
- 内网服务:用 Vault PKI 或 step-ca 自建内部 CA,把内网证书也纳入同一套自动化,把自签证书有效期设得比公共证书更短,比如 30 天。
注意:ACME 客户端要有权限 reload 服务,建议用 systemctl reload 而不是 restart,避免中断连接。
怎么监控证书到期并分级告警?
结论:证书监控要按“21 天 / 10 天 / 3 天”三级告警,47 天周期下最长的那一级不能超过 21 天。
Prometheus + blackbox_exporter 的最小实现:
- alert: SSLCertExpiring21d
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 21
labels: { severity: warning }
- alert: SSLCertExpiring3d
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 3
labels: { severity: critical }
补充要求:
- 用 blackbox_exporter 的
probe_ssl_earliest_cert_expiry 指标,并对多 SAN 证书额外检查每条链路。
- 监控必须独立于自动化脚本:脚本挂了,告警还要能报出来。
- 服务器开启 NTP/chrony 时间同步。证书校验对时间敏感,时钟偏差 5 分钟就可能触发大面积握手失败。
- 把“证书续期失败”单独建一条告警规则,ACME 返回错误(如 DNS API 鉴权失效、验证文件 404)时立刻通知。
哪些坑最容易在短周期下翻车?
结论:翻车点几乎都不在签发环节,而在部署、吊销和老系统兼容上。
- 密钥算法:RSA 2048 换成 ECDSA P-256 可以缩短握手时间,但老客户端(部分 Java 6/7、旧安卓)不兼容,切换前先看访问日志里的 TLS 版本分布。
- 证书链:短周期下证书链更新更频繁,中间证书缺失会导致部分客户端报错,部署脚本里加上
openssl s_client -connect host:443 -showcerts 的自检。
- 硬编码证书路径:老应用把证书路径写死在配置文件甚至代码里,自动化部署后会指向旧文件,这类服务必须先改造再纳入流水线。
- 付费证书与自动化冲突:商业 OV/EV 证书签发要人工核验企业资料,短期化后建议只保留在品牌露出或合规要求的少数域名上,其余全部换成 DV + ACME。
收尾
证书有效期缩短带来的变化,是运维工作从定期人工操作转为持续在线的工程能力:先盘清资产,再把签发、部署、监控三件事串成自动化链路,最后用分级告警兜住异常。2026 年 3 月 15 日是第一道硬性期限,把 ACME 全量跑通并通过 --dry-run,比盯着日历续签更可靠。改造过程中遇到的 DNS-01 鉴权、K8s Ingress 证书重载、内网 CA 设计等具体问题,可以在 GJ 站长论坛(www.gj0.com)发帖交流实战配置。