用脚本自动续期证书行吗

wen 实用脚本 2

本文目录导读:

用脚本自动续期证书行吗

  1. 方案一:使用 Certbot(最推荐,最简单)
  2. 方案二:使用 acme.sh(更灵活,支持更多厂商)
  3. 方案三:通用脚本(适用于任何 CA)
  4. ⚠️ 重要注意事项

完全可以,而且强烈建议使用脚本自动续期证书。

手动续期不仅繁琐,还容易因忘记续期导致网站服务中断,使用脚本自动续期是目前最主流的做法。

以下是几种常见的自动续期方案,以及对应的脚本逻辑:

使用 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天内过期,如果过期则自动续期。

如果你需要手动写一个脚本(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

⚠️ 重要注意事项

  1. 测试你的脚本: 第一次配置好后,先用 --dry-run--force 测试一次,确保脚本能正常运行,并且服务器能成功重载。
  2. 确保服务重载: 证书续期后,必须重载 Web 服务器(Nginx/Apache/HAProxy 等),否则新证书不会生效。
    • Nginx:systemctl reload nginx
    • Apache:systemctl reload apache2
    • 其他:查阅对应服务的文档。
  3. DNS 验证需要 API 密钥: 如果你使用 DNS 验证(特别是通配符证书),需要确保 API 密钥(如 Cloudflare API Token)是长时间有效的,并且脚本有权限读取。
  4. 日志监控: 最好将脚本的输出写入日志文件,方便排查问题。
  5. 网络问题: 自动续期依赖网络,确保服务器能访问到 CA 的服务器(如 acme-v02.api.letsencrypt.org)。
  • 最简单方案: 安装 Certbot,它自动搞定一切。
  • 最灵活方案: 使用 acme.sh,支持最多 CA 和验证方式。
  • 自定义场景: 写一个检查过期时间 + 调用续期命令的 Shell 脚本。

用脚本自动续期完全可行,而且几乎是生产环境的标配。 你完全可以放心去做。

抱歉,评论功能暂时关闭!