acme.sh完整使用指南:从安装到高级配置

a
admin
作者
2026-07-17
发布日期
约 11 分钟
阅读时间

acme.sh是目前最流行的ACME客户端之一。纯Shell脚本、无依赖、支持所有主流CA和DNS服务商。

但很多站长装完就不管了,遇到续签失败才手忙脚乱。 这篇整理acme.sh从安装到高级用法的完整指南。

为什么选acme.sh

和Certbot相比,acme.sh有几个明显优势:

1. 无依赖:纯Shell脚本,不需要Python、Node.js等运行环境。

2. 体积小:安装包不到1MB,资源占用极低。

3. DNS API支持全:支持阿里云、腾讯云、Cloudflare、DNSPod、华为云等上百家DNS服务商。

4. 部署灵活:支持Nginx、Apache、Tomcat、各种面板、Docker、Kubernetes。

5. 多CA支持:Let’s Encrypt、ZeroSSL、Google Trust、Buypass都支持。

安装

一行命令搞定:

curl https://get.acme.sh | sh -s email=your@email.com

或者用GitHub镜像(国内服务器推荐):

curl https://ghproxy.com/https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh -o acme.sh
chmod +x acme.sh
./acme.sh --install -m your@email.com

安装完成后会自动添加cron任务,60天后自动续签。

基础用法

申请单域名证书

HTTP验证方式(需要80端口开放):

acme.sh --issue -d example.com --webroot /var/www/html/

DNS验证方式(推荐,支持通配符):

以阿里云为例,先配置DNS API:

export Ali_Key="LTAI4xxxxx"
export Ali_Secret="xxxxxxx"

acme.sh --issue --dns dns_ali -d example.com

申请通配符证书

通配符证书必须用DNS验证:

acme.sh --issue --dns dns_ali -d example.com -d *.example.com

申请多域名证书

一张证书覆盖多个域名:

acme.sh --issue --dns dns_ali \
    -d example.com \
    -d www.example.com \
    -d api.example.com \
    -d blog.example.com

部署证书

申请成功后,证书在acme.sh的内部目录,不要直接用。应该用 --install-cert 部署到目标位置。

部署到Nginx

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"

部署到Apache

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

部署到宝塔面板

acme.sh --install-cert -d example.com \
    --key-file /www/server/panel/vhost/cert/example.com/privkey.pem \
    --fullchain-file /www/server/panel/vhost/cert/example.com/fullchain.pem \
    --reloadcmd "nginx -s reload"

DNS API配置

acme.sh支持上百家DNS服务商。常见几个:

阿里云

export Ali_Key="LTAI4xxxxx"
export Ali_Secret="xxxxxxx"

去阿里云控制台 → AccessKey管理 → 创建AccessKey。

腾讯云/DNSPod

export DP_Id="12345"
export DP_Key="xxxxxxx"

去DNSPod控制台 → API密钥 → 创建。

Cloudflare

export CF_Token="xxxxxxx"
export CF_Account_ID="xxxxxxx"

去Cloudflare仪表盘 → 我的个人资料 → API令牌 → 创建令牌。

华为云

export HUAWEICLOUD_Username="你的账号"
export HUAWEICLOUD_Password="你的密码"

重要:API密钥只在首次申请时需要配置,之后acme.sh会自动保存,续签时自动读取。

自动续签

acme.sh安装时已经配置了cron任务,默认每天检查一次,证书到期前30天自动续签。

查看cron任务

crontab -l | grep acme

手动续签所有证书

acme.sh --renew-all

强制续签某个证书

acme.sh --renew -d example.com --force

高级用法

切换CA

默认用Let’s Encrypt,可以切换到ZeroSSL:

acme.sh --set-default-ca --server zerossl

切回Let’s Encrypt:

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

使用ECC证书

ECC证书比RSA更小、更快、更安全:

acme.sh --issue -d example.com --dns dns_ali --keylength ec-256

自动更新acme.sh

acme.sh --upgrade --auto-upgrade

查看所有证书

acme.sh --list

常见问题

问题一:DNS验证超时

报错DNS problem: NXDOMAIN looking up TXT

原因:DNS API配置错误或DNS未传播。

解决

  • 检查API密钥是否正确
  • 延长DNS等待时间:--dnssleep 300
  • 手动验证TXT记录:dig _acme-challenge.example.com TXT

问题二:80端口被占

报错Port 80 is already used by ...

解决

  • 停止占用80端口的服务
  • 改用DNS验证:--dns dns_ali

问题三:续签失败

报错Error renew

解决

  • 查看详细日志:--debug 2
  • 检查DNS API密钥是否过期
  • 手动执行续签命令查看具体错误

问题四:证书部署后不生效

原因:Web服务器未重载。

解决

  • 检查 --reloadcmd 是否正确
  • 手动重载:systemctl reload nginx

问题五:ZeroSSL邮箱验证

ZeroSSL要求邮箱验证,首次使用会报错。

解决:到ZeroSSL官网注册账号并验证邮箱,或用 --accountkeylength 2048 指定密钥长度。

卸载acme.sh

acme.sh --uninstall

会移除脚本、cron任务、证书目录。

最佳实践

1. 用DNS验证

HTTP验证受限于80端口和Web服务器配置,DNS验证更稳定、支持通配符。

2. 用ECC证书

ECC证书比RSA性能更好、安全性更高、兼容性已经足够。

3. 配置自动更新

acme.sh --upgrade --auto-upgrade

4. 监控续签状态

定期查看cron日志,确保续签成功:

cat /var/log/syslog | grep acme

5. 备份证书目录

acme.sh的证书目录在 ~/.acme.sh/,定期备份到安全位置。

结语

acme.sh是个人站长和运维的SSL自动化利器。一次配置,永久免维护。如果你还在手动申请证书,花半小时配置acme.sh,以后再不用操心证书续签。

本文到此结束