目录
为什么SSL证书会意外过期
SSL证书有固定的有效期 — 商业证书目前最长398天(约13个月),Let's Encrypt为90天。尽管如此,仍有许多网站主遭遇证书意外过期,原因包括:
- 忘记记录到期日期或设置了错误的提醒时间
- CA发送的续期通知邮件被归入垃圾邮件
- 管理员邮箱已更换但未在CA处更新
- 自动续期已配置,但因DNS更改后静默失败
结果是:网站显示"您的连接不是私密连接",红色警告页面让访客望而却步,业务立即受损。
行业数据:根据Venafi(2022年)的报告,超过80%的证书相关中断是由计划外的证书过期引起的 — 而这些完全可以通过正确配置自动续期来预防。
Let's Encrypt + Certbot自动续期
Let's Encrypt是全球最受欢迎的免费CA,颁发90天有效期证书。Certbot是IETF推荐的客户端,完全支持自动续期。
安装Certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
# 通过snap安装(推荐)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
申请首张证书
# Nginx服务器
sudo certbot --nginx -d example.com -d www.example.com
# Apache服务器
sudo certbot --apache -d example.com -d www.example.com
# 独立模式(无Web服务器)
sudo certbot certonly --standalone -d example.com
测试自动续期
# 干运行测试 — 模拟续期但不获取真实证书
sudo certbot renew --dry-run
# 成功输出:"Congratulations, all simulated renewals succeeded"
Certbot会自动安装systemd定时器或cron任务,每12小时运行一次,对剩余天数不足30天的证书进行续期。
DirectAdmin Auto-SSL(虚拟主机)
如果您使用基于DirectAdmin的虚拟主机(如AsiaGB虚拟主机),SSL管理极为简便 — DirectAdmin内置Auto-SSL功能。
在DirectAdmin中启用Auto-SSL
- 登录您的DirectAdmin控制面板
- 进入 高级功能 → SSL证书
- 选择 来自Let's Encrypt的免费自动证书
- 勾选 强制SSL并重定向至https
- 点击 保存
AsiaGB虚拟主机:所有正确指向服务器的域名默认开启Auto-SSL,无需额外配置,证书每60天自动续期一次。
命令行检查SSL状态
# 查看当前证书到期日期
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
VPS上设置Cron Job自动续期
在自管理的VPS上,即使Certbot已安装定时器,额外添加cron任务可提供双重保障。
# 打开root crontab编辑器
sudo crontab -e
# 添加以下行(每天凌晨3:30运行)
30 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx" 2>&1 | logger -t certbot-renew
关键参数说明
| 参数 | 作用 |
|---|---|
--quiet | 无异常时不输出日志 |
--post-hook | 续期成功后执行命令(重载nginx) |
logger -t certbot-renew | 将输出写入syslog以便后续检查 |
通配符证书与DNS验证
申请通配符SSL(*.example.com)时,需使用DNS验证代替HTTP验证:
# 通过DNS验证申请通配符证书
sudo certbot certonly --manual --preferred-challenges dns \
-d "*.example.com" -d "example.com"
# 自动续期使用DNS插件(如Cloudflare)
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
-d "*.example.com"
SSL到期监控与提醒
即使配置了自动续期,独立的外部监控也能确保您在出现问题时第一时间知晓。
命令行检查到期日期
# 查看到期日期
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -enddate
# 示例输出: notAfter=Jan 17 12:00:00 2027 GMT
自动化提醒脚本
#!/bin/bash
# ssl-check.sh — 每日通过cron运行,剩余不足30天时发送邮件提醒
DOMAIN="example.com"
DAYS_WARN=30
ALERT_EMAIL="[email protected]"
EXPIRY=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
TODAY_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $TODAY_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt $DAYS_WARN ]; then
echo "SSL for $DOMAIN expires in $DAYS_LEFT days!" | \
mail -s "SSL ALERT: $DOMAIN expires soon" $ALERT_EMAIL
fi
在线监控工具
| 工具 | 主要功能 | 价格 |
|---|---|---|
| UptimeRobot | SSL+可用性检测,邮件/短信提醒 | 免费(基础版) |
| SSL Labs Monitor | 自动SSL评级检测 | 免费 |
| Freshping | 每分钟检测,Slack提醒 | 免费50次检测 |
| Zabbix/Grafana | 企业级全栈监控 | 自托管免费 |
付费商业SSL证书续期
付费证书如RapidSSL、GeoTrust每次续期都需要重新进行域名验证,但可以实现半自动化:
商业SSL续期步骤
- 提前30-60天在服务器上生成新CSR
- 通过邮件、DNS TXT记录或文件上传验证域名
- 下载新证书并安装到服务器
- 重载Web服务器使新证书生效
# 生成新CSR
openssl req -new -newkey rsa:2048 -nodes \
-keyout example.com.key \
-out example.com.csr \
-subj "/C=TH/ST=Bangkok/L=Bangkok/O=My Company/CN=example.com"
AsiaGB SSL价格(每年)
| 类型 | 产品 | 年费 |
|---|---|---|
| DV SSL | RapidSSL | ฿1,000 |
| DV通配符 | RapidSSL Wildcard | ฿5,000 |
| OV SSL | GeoTrust True BusinessID | ฿4,000 |
| EV SSL | GeoTrust True BusinessID w/EV | ฿7,000 |
自动续期失败排查
常见错误:certbot renew失败
最常见原因:DNS A记录仍指向旧服务器IP,或防火墙封锁了Let's Encrypt HTTP验证所需的80端口。
# 查看certbot日志
sudo journalctl -u certbot -n 50
# 或
sudo cat /var/log/letsencrypt/letsencrypt.log | tail -50
# 验证80端口是否开放
sudo ss -tlnp | grep :80
curl -I http://example.com/.well-known/acme-challenge/test 2>&1 | head -5
常见问题与解决方法
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 80端口连接被拒绝 | 防火墙封锁或Web服务器停止 | 开放80端口,启动Web服务器 |
| 请求过于频繁 | 触发Let's Encrypt速率限制 | 等待1小时,或用暂存服务器测试 |
| DNS传播延迟 | DNS尚未更新 | 等待24-48小时,或用dig验证 |
| 权限被拒绝 | Certbot缺少写入权限 | 使用sudo运行或修复目录权限 |
防止SSL过期检查清单
对每个域名执行此检查清单,彻底杜绝证书过期:
| 检查项目 | 验证方法 | 状态 |
|---|---|---|
| 已启用自动续期 | certbot renew --dry-run | ✅ 必须 |
| 已配置Cron任务 | crontab -l | grep certbot | ✅ 必须 |
| 外部监控 | UptimeRobot或SSL提醒服务 | ⚠️ 建议 |
| 提醒邮箱正确 | 在CA/DirectAdmin处检查 | ✅ 必须 |
| 80端口开放 | curl http://domain/.well-known/test | ✅ HTTP验证时必须 |
| DNS指向正确 | dig +short A example.com | ✅ 必须 |
常见问题解答
更新:2026年10月19日 | 分类:SSL证书 | 什么是SSL通配符证书?→