acme.sh完整使用指南:从安装到高级配置
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,以后再不用操心证书续签。