Linux 配置 acmd.sh 自动申请并部署SSL证书

acmd.sh 自动申请并部署证书

操作时间:2026.2.5
acmd.sh版本: v3.1.3
Linux登录用户:root
域名托管机构: CloudFlare

安装acmd.sh

curl https://get.acme.sh | sh

会默认安装到 ~/.acme.sh 目录下,当前登录用户为root,所以后续直接用绝对路径 /root/.acme.sh 表示

安装成功之后,会自动在系统的crontab里增加一条定时任务,可以通过 crontab -l 查看。

# 会生成一个每天随机时间执行的定时任务,用于自动判断并续期证书
6 7 * * *  "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

# 可以修改一下,将输入记录到日志
6 7 * * *  "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /var/log/acme.log 2>&1

切换证书颁发机构

主动切换证书颁发机构为 Let's Encrypt 。现在的版本默认为 ZeroSSL——需要注册账号才能用

/root/.acme.sh/acme.sh --set-default-ca --server letsencrypt

# 或者
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

配置DNS的token

Let's Encrypt 需要判断你对申请证书的域名拥有控制权,提供了多个验证方案,其中验证DNS是比较简单的。

自动验证DNS

需要提前配置CloudFlare的api权限信息,需要 ApiToken 和 账号ID,
可以追加到 ~/.bashrc ,然后执行 source ~/.bashrc ,或者另起一个文件,之后再执行source命令。

# 配置 CloudFlare 用于自动获取ssl证书
export CF_Token="xxxxx"
export CF_Account_ID="xxxxx"

手动验证DNS

!!!这种操作方式稍微麻烦,且不支持定时任务自动续期,不推荐,但是可以用来测试。!!!
每次去Let's Encrypt申请证书时,都会重新校验DNS。手动验证DNS的方式无法通过定时任务添加DNS记录,所以不适用定时更新证书
需要先执行<手动申请证书>的命令,会生成一个DNS的txt类型的key和value,在DNS配置好解析后,再执行 --renew 命令重新获取证书。之后可以直接跳转到 手动安装证书

/root/.acme.sh/acme.sh --issue --dns dns_manual -d my-domain.com -d *.my-domain.com
# 这里的DNS类型表示是手动执行

# 执行完的结果类似
# 如果 -d 只有一个域名,执行完这个条命令会生成一条 TXT 的值。
# 如果 -d 有两个域名,执行完这个条命令可能会生成两条 TXT 的值,也可能只会生成一条。
[Thu Mar  5 06:14:02 PM CST 2026] .......
[Thu Mar  5 06:14:02 PM CST 2026] Cannot find DNS API hook for: dns_manual
[Thu Mar  5 06:14:02 PM CST 2026] You need to add the TXT record manually.
[Thu Mar  5 06:14:02 PM CST 2026] Add the following TXT record:
[Thu Mar  5 06:14:02 PM CST 2026] Domain: '_acme-challenge.my-domain.com'
[Thu Mar  5 06:14:02 PM CST 2026] TXT value: '9VQV1JZ0Zg9c9trAlQcKWreWHCThc2tKnbV07tdSpyk'
[Thu Mar  5 06:14:02 PM CST 2026] Please make sure to prepend '_acme-challenge.' to your domain
[Thu Mar  5 06:14:02 PM CST 2026] so that the resulting subdomain is: _acme-challenge.my-domain.com
[Thu Mar  5 06:14:02 PM CST 2026] Please add the TXT records to the domains, and re-run with --renew.
[Thu Mar  5 06:14:02 PM CST 2026] ......

# .... 在域名商配置好DNS解析,并等待几分钟同步

# 执行如下命令重新获取证书
/root/.acme.sh/acme.sh --renew -d my-domain.com -d *.my-domain.com
# 如果第一次执行失败,可能是网络问题,可以再重新执行一遍该命令

手动申请证书

Let's Encrypt 支持生成通配符域名证书

/root/.acme.sh/acme.sh --issue \
  --dns dns_cf \
  -d my-domain.com -d *.my-domain.com

# 或者生成单域名证书
/root/.acme.sh/acme.sh --issue \
  --dns dns_cf \
  -d api.my-domain.com

生成的证书会默认存放在 /root/.acme.sh/
acme.sh 生成一次证书之后,会将配置的 CloudFlare token存储到 ~/.acme.sh/account.conf

手动安装证书

/root/.acme.sh/acme.sh --install-cert -d my-domain.com -d *.my-domain.com \
  --cert-file       /data/nginx/cert/my-domain.com_auto_install.cer \
  --key-file        /data/nginx/cert/my-domain.com_auto_install.key \
  --fullchain-file  /data/nginx/cert/my-domain.com_auto_install.fullchain.cer \
  --reloadcmd      "docker exec nginx nginx -s reload"

# --cert-file 是将生成的证书复制到当前路径
# --key-file  是将生成的证书密钥复制到当前路径
# --reloadcmd 是重启服务器的命令

测试续期证书

/root/.acme.sh/acme.sh --renew -d my-domain.com --force

执行完以上步骤都没有问题,那就可以放心了,因为定时任务已经添加了

查看/删除定时任务

acme.sh 的任务列表/证书列表

# 会列出所有证书,及下次续期的时间 ——会在证书过期前一个月主动续期
/root/.acme.sh/acme.sh --list

# 删除更新证书的任务 (但是不会删除证书文件,删除任务成功后,会提示证书文件的保存地址,可以手动删除)
/root/.acme.sh/acme.sh --remove -d my-domain.com

# 可以一次性删除多个
/root/.acme.sh/acme.sh --remove -d my-domain.com -d xxx.com

卸载 acme.sh

# 卸载 acme.sh 命令,并删除 crontab 定时任务 (但是不会删除 /root/.acme.sh/ 文件夹,需要手动删除)
/root/.acme.sh/acme.sh --uninstall

2026.3.5修改:新增手动验证DNS方式
2026.4.7修改:确认手动验证DNS无法通过定时任务自动续期证书

posted @ 2026-02-06 14:08  azsd  阅读(65)  评论(0)    收藏  举报