记一次域名证书自动续签

记一次域名证书自动续签

前要

我很早之前就使用了 acme.sh 脚本自动化更新域名

但我并不是先知道 acme.sh, 而是从某一个技术博主的推荐中使用的一个第三方提供免费域名签发的平台, 叫 freessl.cn

这个网站更新使用的是也是 acme.sh, 只不过证书的签发平台是它自己, 而不是我们熟知的 ZeroSSL, Let's Encrypt

问题

当前的免费证书签发有效期都是三个月, 我经常发现我配置在服务的 acme.sh 自动续签不起作用

home.wuhunyu.top 域名关联了我许多服务, 这个域名的证书过期, 引发了许多问题

  • nginx 以改域名申请的证书的反向代理通通出错了
  • 为又拍云 CDN 配置的回源证书过期导致博客的部分图片无法访问

解决

今天抽了点时间, 准备研究一下 acme.sh

目标

  1. 证书到期前自动续签
  2. 续签之后证书相关文件复制到指定的路径
  3. 续签并复制后, 重载 nginx 服务以重新加载新证书

方案

证书签发平台

我的服务器(国内)无法访问 ZeroSSL, 换成了 Let's Encrypt 之后是没问题的

续签机制

acme.sh 支持多种自动续签机制, 我是在阿里云购买的域名, 解析管理也在阿里云

可以通过 DNS 验证的方式来实现自动验证

操作步骤

实际的操作步骤主要分为两步

  1. 申请证书. 此操作只需要操作一次即可, 后续通过 cron 定时任务定期更新即可, 无需人工干预
  2. 复制证书并重载 nginx. 此操作也只需要手动操作一次, acme.sh 会记住这个动作, 并在续签之后自动执行

实操

安装 acme.sh
1
2
3
4
5
6
# 安装命令
$ curl https://get.acme.sh | sh -s email=my@example.com

# 安装完毕之后, 可以查询 acme.sh 添加的定时任务
$ crontab -l
43 0 * * * "/home/xxx/.acme.sh"/acme.sh --cron --home "/home/xxx/.acme.sh" > /dev/null
阿里云 ak 申请 & 配置

针对阿里云的域名, 具体操作如下

  1. 修改 ~/.acme.sh/account.conf, 添加以下环境变量
1
2
export Ali_Key="<key>"
export Ali_Secret="<secret>"

阿里云 ak 申请地址, 需要给 AliyunDNSFullAccess 权限

  1. 申请证书时, 额外指定 --dns dns_ali 即可
申请证书

我们以 baidu.com 这个域名为例, 当然我没有管理 baidu.com 这个域名的权限, 下面只是举例而已

1
2
# 申请证书, 由于添加 TXT 记录到被感知需要时间, 所以有可能会失败几次, 慢慢等待它重试即可
$ ~/.acme.sh/acme.sh --issue -d baidu.com --dns dns_ali --debug
复制证书 & 重载 nginx

假设我们需要将证书复制到 ~/cert/baidu.com 目录下

1
2
3
4
$ ~/.acme.sh/acme.sh --install-cert -d baidu.com --ecc \
--key-file ~/cert/baidu.com/key.pem \
--fullchain-file ~/cert/baidu.com/fullchain.pem \
--reloadcmd "service nginx reload"

这样配置之后, 就可以全自动续签证书 & 重载 nginx 了

作者

wuhunyu

发布于

2025-12-19

更新于

2025-12-19

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×