HTTPS 证书申请与自动续期
证书过期导致的业务中断完全可以避免——前提是把续期当成自动流程而不是人工任务。
免费证书的两种验证
Let's Encrypt 通过挑战(challenge)验证域名控制权:
- HTTP-01:在
/.well-known/acme-challenge/放一个文件,CA 通过 80 端口访问。要求域名能被公网访问且 80 端口开放; - DNS-01:在域名 TXT 记录写入验证值。支持泛域名证书,适合多子域名和无法开放 80 的场景。
certbot 标准流程
# Apache 自动配置
certbot --apache -d example.com -d www.example.com
# 只取证书不动配置(Nginx 手动引用)
certbot certonly --webroot -w /var/www/html -d example.com
# 检查自动续期
certbot renew --dry-run
certbot 安装时通常自带 systemd timer,每天两次检查、剩余 30 天内自动续期。确认它在跑:
systemctl list-timers | grep certbot
续期后要 reload
证书文件更新了,但 Web 服务器加载的还是旧证书。用 deploy hook 自动重载:
# /etc/letsencrypt/renewal-hooks/deploy/reload.sh
#!/bin/sh
systemctl reload nginx
漏掉这一步是「证书明明续了还是提示过期」的标准原因。
监控兜底
自动化也可能静默失败(DNS 变更、80 端口被占、CA 限流)。加一层独立监控,剩余有效期低于 14 天就告警:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -enddate
外部拨测服务(UptimeRobot 等)也提供证书过期检查,接入现有的告警渠道即可。
部署建议
- 全站 301 到 HTTPS,别保留 HTTP 版本;
- TLS 配置用 Mozilla 的生成器按「中间兼容」档取配置,开 HSTS 前先确认所有子域都能 HTTPS;
- 通配符证书(DNS-01)适合子域名多的场景,一张证书覆盖
*.example.com,续期流程也只有一套。