选哪个主要看你的服务器环境和运维习惯。如果是轻量级 VPS 或需要对接多家云厂商 DNS,acme.sh 更灵活;如果是标准 Linux 发行版且希望官方原生支持,Certbot 更稳妥。
先说结论:两者都能实现自动续签,核心差异在于依赖环境和自动化集成方式。
- 适合:acme.sh 适合 Shell 环境、多云 DNS API 场景;Certbot 适合标准包管理环境、Web 服务器插件集成。
- 重点看:acme.sh 零依赖纯脚本,Certbot 需 Python 环境。
- 别忽略:Certbot 官方推荐但配置较重,acme.sh 社区驱动但 DNS 接口丰富。
核心差异分析
两者都是基于 ACME 协议实现的客户端,用来自动化申请和续期 Let's Encrypt 等免费 SSL 证书。核心区别在于实现语言和设计理念。acme.sh 是纯 Shell 脚本实现,零依赖,仅需基础 Shell,因此体积轻量,适合嵌入式或低资源环境。Certbot 由 Python 编写,是 Let's Encrypt 官方推荐的客户端,依赖 Python 运行环境,安装包较大,但与现代 Web 服务器(如 Nginx、Apache)的插件集成度更高。
在 DNS 验证支持上,acme.sh 原生支持超 60 种云服务商 API,适合泛域名证书申请;Certbot 通常需要通过插件扩展 DNS 验证能力,部分场景需手动配置。
安装与初始配置
如果你决定使用 acme.sh,安装只需一条命令:
curl https://get.acme.sh | sh如果你决定使用 Certbot,在 Debian/Ubuntu 上通常通过包管理器安装,需根据 Web 服务器选择插件:
sudo apt update
# Nginx 用户
sudo apt install certbot python3-certbot-nginx
# Apache 用户
sudo apt install certbot python3-certbot-apache证书申请实操
1. acme.sh 申请泛域名证书(DNS 验证)
使用 DNS API 前,必须先导出密钥环境变量。以阿里云为例:
export Aliyun_Key="你的 Key"
export Aliyun_Secret="你的 Secret"
acme.sh `--issue` `--dns` dns_ali -d example.com -d *.example.com2. Certbot 申请证书(HTTP 验证)
sudo certbot `--nginx` -d example.com
# 或
sudo certbot `--apache` -d example.com自动续期验证与路径
1. 续期任务检查
acme.sh 安装时会自动创建 cron 任务。Certbot 安装后通常使用 systemd timer,建议检查状态:
systemctl status certbot.timer2. 手动测试续期
acme.sh 验证:
acme.sh `--cron` `--home` "~/.acme.sh"Certbot 验证(dry-run 模式):
sudo certbot renew `--dry-run`3. 证书存储路径
- acme.sh:默认存储在用户主目录,如
~/.acme.sh/example.com/。 - Certbot:默认存储在
/etc/letsencrypt/live/example.com/。
部署脚本需根据上述路径读取 fullchain.pem 和 privkey.pem。
常见问题与排查
1. 依赖环境缺失:Certbot 需要 Python 环境,在极简容器或嵌入式系统中可能占用过高资源,此时 acme.sh 更理想。
2. DNS API 密钥权限:使用 DNS 验证时,确保 API 密钥仅有 DNS 编辑权限,避免泄露主账户密钥。
3. 端口占用:HTTP-01 挑战验证需要开放 80 端口,若被占用或防火墙拦截,验证会失败。
4. 证书路径差异:acme.sh 证书存储在标准化目录结构,Certbot 路径可能分散,部署脚本需对应调整。
参考文档
- acme.sh 官方仓库:https://github.com/acmesh-official/acme.sh
- Certbot 官方文档:https://certbot.eff.org/
- Let's Encrypt 验证类型说明:https://letsencrypt.org/docs/challenge-types/