雨云HTTPS证书自动续期与监控:acme.sh+Let's Encrypt实战

acme.sh 自动签发续期 + 一层到期监控,证书过期这事可以彻底忘掉
发布于
10

HTTPS 现在是标配,但 Let’s Encrypt 证书只有 90 天有效期,手动续迟早会忘,忘了就是全站红框、接口失效。在雨云云服务器上用 acme.sh 配合 Let’s Encrypt,签发和续期都能自动化,再补一层到期监控,基本可以把它忘掉。下面是完整流程。

一、为什么要在雨云上自动管证书

雨云云服务器开机即用、公网 IP 固定,跑 acme.sh 很合适。自动续期省掉人工日历提醒,监控能兜住「续期脚本本身挂了」的极端情况。新购用优惠码 admin01 走专属入口 https://www.jiyueip.com/link/5617 五折拿服务器,多域名站点也能轻松起好几台。

二、安装 acme.sh

curl https://get.acme.sh | sh
source ~/.bashrc
acme.sh --version

装完会写一条 cron 到用户 crontab(默认每天检查续期),不用自己再配。证书默认存 ~/.acme.sh/

三、签发证书

两种方式:

  • HTTP 验证:需要 80 端口可访问,适合单域名。 acme.sh --issue -d example.com -w /var/www/html
  • DNS 验证:用 API 改解析记录,适合泛域名和不能开 80 端口的内网服务。 acme.sh --issue --dns dns_ali -d example.com -d *.example.com

雨云域名解析如果在第三方(阿里云等),填对应的 DNS API 环境变量即可,acme.sh 支持几十家。

四、crontab 静默续期

acme.sh 安装时已自动写入类似:

0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

它只在距过期 30 天内才真正续,平时跑着无副作用。别手痒去改这条,删了就没人续了。

五、部署到 Nginx 并自动 reload

证书签发后,用 --install-cert 把它复制到 Nginx 目录并 reload:

acme.sh --install-cert -d example.com 
--key-file /etc/nginx/ssl/example.com.key 
--fullchain-file /etc/nginx/ssl/example.com.crt 
--reloadcmd "systemctl reload nginx"

这样每次续期成功会自动 reload Nginx,不中断连接。

六、加一层到期监控

续期脚本也可能自己挂(DNS API 失效、权限丢了)。加个监控兜底:

EXPIRE=$(echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
DAYS=$(( ( $(date -d "$EXPIRE" +%s) - $(date +%s) ) / 86400 ))
if [ "$DAYS" -lt 15 ]; then
    echo "证书还剩 $DAYS 天" | mail -s "SSL 证书告警" admin@example.com
fi

丢进 crontab 每天跑一次,小于 15 天就告警,给你留出排查时间。

七、多域名与泛域名

一台雨云服务器上多个站点,每个 -d 加一个域名即可,acme.sh 会把它们塞进同一张 SAN 证书。泛域名 *.example.com 必须用 DNS 验证,且要单独一条 -d example.com 把根域也包进去。

八、常见翻车点

  • DNS 验证的 API 密钥过期,续期静默失败——监控能抓到;
  • reloadcmd 写错,证书更新了 Nginx 还在用旧的;
  • ~/.acme.sh 里临时文件当正式证书用,路径错乱;
  • CDN 层也缓存了证书,源站换了 CDN 没换,用户看到旧的。

常见问题

关于在雨云服务器上自动管 SSL 证书的常见疑问,下面一并解答。

常见问题(FAQ)

雨云上 Let's Encrypt 证书多久要续一次?
90 天有效期。acme.sh 装在雨云服务器后会写一条每天检查的 cron,剩 30 天时自动续,不用自己记日子。
泛域名证书怎么申请?
必须用 DNS 验证(--dns 模式),而且根域 example.com 和 *.example.com 要分两条 -d 都列上。HTTP 验证做不到泛域名。
续期失败了怎么发现?
靠到期监控脚本(本文第6节,小于15天告警),或者定期翻 acme.sh 的 cron 日志看有没有报错。监控是续期脚本挂掉时的兜底。
用了 CDN 还要单独管证书吗?
要。CDN 节点有自己的证书配置,源站换了 CDN 不换,用户看到的还是旧证。两边都要更新。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600