本文目录导读:

完全可以,而且强烈建议使用脚本自动续期证书。
手动续期不仅繁琐,还容易因忘记续期导致网站服务中断,使用脚本自动续期是目前最主流的做法。
以下是几种常见的自动续期方案,以及对应的脚本逻辑:
使用 Certbot(最推荐,最简单)
如果你使用的是 Let‘s Encrypt 的证书,Certbot 是官方的客户端,它已经集成了自动续期脚本。
核心命令:
# 测试续期流程(不会真的续期,只会模拟) certbot renew --dry-run # 如果测试通过,直接运行: certbot renew
自动续期脚本(通常不需要自己写): Certbot 安装时通常会自动在系统的定时任务中写入一个脚本。
- 查看是否已自动配置:
- Linux (crontab): 检查
/etc/crontab或/etc/cron.d/certbot - systemd: 检查
systemctl list-timers | grep certbot - 大多数系统(Ubuntu/Debian/CentOS)安装后会自动生成一个定时器,每天执行两次,检查证书是否在30天内过期,如果过期则自动续期。
- Linux (crontab): 检查
如果你需要手动写一个脚本(99%的情况不需要):
#!/bin/bash # /usr/local/bin/auto_renew_cert.sh # 1. 更新证书 certbot renew --quiet --non-interactive # 2. 如果你的证书用于 Nginx/Apache,certbot 会自动重载服务 # 但如果用于其他服务(如 HAProxy, Traefik 等),可能需要手动重载 # systemctl reload nginx # 或者 systemctl reload haproxy # 3. 记录日志 echo "Certificate renewal process completed at $(date)" >> /var/log/cert_renew.log
设置定时任务(certbot 没自动加):
# 编辑 crontab crontab -e # 添加一行(每天凌晨 3 点执行一次,certbot 会自动判断是否真的需要续期) 0 3 * * * /usr/bin/certbot renew --quiet --non-interactive && systemctl reload nginx
使用 acme.sh(更灵活,支持更多厂商)
acme.sh 是一个纯 Shell 脚本的 ACME 客户端,功能更强大,支持 DNS API(方便通配符证书)和多种 CA(Let‘s Encrypt、ZeroSSL 等)。
安装后自动启用自动续期:
# 安装 curl https://get.acme.sh | sh # 申请证书(例如使用 DNS API 申请通配符) acme.sh --issue --dns dns_cf -d example.com -d '*.example.com' # 默认情况下,acme.sh 安装时会自动添加一个 cronjob # 可以通过以下命令查看: crontab -l | grep acme
自动续期脚本逻辑(acme.sh 内置):
你几乎不需要写脚本,它默认每天检查一次,自动续期,并执行 --reloadcmd 来重载你的 Web 服务器。
手动触发(用于测试):
acme.sh --renew -d example.com --force
通用脚本(适用于任何 CA)
如果你使用的是其他 CA(如 BuyPass、Google Trust Services)或自己生成的证书,你可以写一个通用的脚本,结合定时任务。
脚本逻辑示例:
#!/bin/bash
DOMAIN="yourdomain.com"
CERT_DIR="/etc/ssl/private"
DAYS_BEFORE_EXPIRY=30
# 1. 检查证书过期时间
CERT_FILE="$CERT_DIR/$DOMAIN.crt"
if [ ! -f "$CERT_FILE" ]; then
echo "Certificate file not found!"
exit 1
fi
EXPIRY_DATE=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
echo "Certificate for $DOMAIN expires in $DAYS_LEFT days."
# 2. 如果小于30天,则执行续期操作
if [ "$DAYS_LEFT" -lt "$DAYS_BEFORE_EXPIRY" ]; then
echo "Certificate is about to expire. Starting renewal..."
# 这里调用你的续期命令,
# certbot renew
# 或 acme.sh --renew
# 或调用其他 API
# 3. 续期成功后重载服务
# systemctl reload nginx
echo "Renewal completed at $(date)"
else
echo "Certificate is still valid. No action needed."
fi
⚠️ 重要注意事项
- 测试你的脚本: 第一次配置好后,先用
--dry-run或--force测试一次,确保脚本能正常运行,并且服务器能成功重载。 - 确保服务重载: 证书续期后,必须重载 Web 服务器(Nginx/Apache/HAProxy 等),否则新证书不会生效。
- Nginx:
systemctl reload nginx - Apache:
systemctl reload apache2 - 其他:查阅对应服务的文档。
- Nginx:
- DNS 验证需要 API 密钥: 如果你使用 DNS 验证(特别是通配符证书),需要确保 API 密钥(如 Cloudflare API Token)是长时间有效的,并且脚本有权限读取。
- 日志监控: 最好将脚本的输出写入日志文件,方便排查问题。
- 网络问题: 自动续期依赖网络,确保服务器能访问到 CA 的服务器(如
acme-v02.api.letsencrypt.org)。
- 最简单方案: 安装 Certbot,它自动搞定一切。
- 最灵活方案: 使用
acme.sh,支持最多 CA 和验证方式。 - 自定义场景: 写一个检查过期时间 + 调用续期命令的 Shell 脚本。
用脚本自动续期完全可行,而且几乎是生产环境的标配。 你完全可以放心去做。