SSL证书运维效率提升:5个减少过期故障的实操方法
证书过期导致的服务不可用,是运维值班时最不想遇到的告警之一。这篇文章整理了5个在生产环境跑通的做法,覆盖自动续签、内网CA搭建、多节点分发、到期监控和私钥轮换,帮你把证书管理的人工操作和遗漏风险降下来。
证书过期导致的服务中断,往往是运维最不愿意背的锅。手动登录每台机器检查到期时间、逐个下载上传证书,不仅耗时,还很容易漏掉边缘节点。这几年踩过几次坑之后,我整理了五个在生产环境跑通的做法,核心思路是把重复操作交给脚本,把关键节点纳入监控。
用acme.sh做无人值守续签,别再用交互式Certbot
如果你还在用交互式Certbot手动申请证书,建议切到acme.sh。它支持绝大多数DNS服务商的API,做DNS验证时不用停服务。实际部署时,建议把acme.sh装到独立目录,用非root账户跑定时任务。每天跑一次acme.sh --cron,它会自动识别30天内到期的证书并完成续期。这里有个细节:更新后务必通过--reloadcmd钩子重载Nginx或HAProxy,否则新证书不会生效。建议把reload命令写成独立脚本,先检查配置语法再重载,避免证书更新成功但配置语法错误导致服务挂掉。
内网服务用私有CA,把签发权限下放
公网证书用Let's Encrypt足够,但内网微服务之间的TLS通信不建议直接用长期自签证书。可以用Step CA或CFSSL搭一套内部CA,配合短期证书加自动轮转。操作上可以把证书申请权限开放给各服务的Owner,通过ACME协议限制只能申请指定域名范围的证书。这样运维不用当证书审批的瓶颈,各团队也能自助完成签发。注意做好CA根证书的互信分发,尤其是容器环境里,基础镜像要把根证书打进去。
证书更新后,用Ansible做多节点一致性分发
证书续期后最头疼的是同步到所有节点。手动SCP到每台机器既慢又容易漏,特别是负载均衡后面有十几二十个节点时。我的做法是把证书和私钥放在Git私有仓库或内部对象存储,写Ansible playbook做分发。Playbook里除了拷贝文件,一定要加一步校验证书指纹,确认所有节点落盘的内容一致。如果用了配置管理工具如Salt或Puppet,可以把证书变更和Nginx配置变更绑在一起,Git提交后自动触发部署。踩过的一个坑是:只同步了证书没同步中间证书链,导致部分客户端握手失败,建议把fullchain一起下发。
别只靠日历提醒,写脚本或Blackbox做到期监控
即使有了自动续签,监控也不能省。我做过两层防护:第一层是本地脚本,用openssl s_client -connect取到期时间,跟当前时间比对,小于7天就发企业微信告警。脚本建议跑在独立监控节点上,别跑在证书所在机器,避免机器挂了监控也失效。第二层用Prometheus加Blackbox Exporter的SSL探针,可以直接在Grafana上看到所有域名证书的剩余天数,还能配置告警规则。排查时如果发现证书已更新但监控还报过期,先检查Blackbox缓存和探针目标是否指向了正确的入口IP,有时候CDN或负载均衡后面挂的是旧证书。
每次续期换新私钥,用Vault集中托管
很多人续期证书时只更新证书文件,私钥一用好几年,这其实有风险。建议每次续期都重新生成密钥对,旧的直接废弃。私钥别明文躺在服务器磁盘上,可以用HashiCorp Vault的PKI引擎或KV引擎托管,服务启动时通过Vault Agent或API动态加载。这样即使某台服务器被入侵,私钥也不会随镜像或快照泄露。另外定期做清理,把已经吊销、过期的证书和私钥删掉,保持环境整洁。