acme.sh 与 certbot 在 Let's Encrypt 自动续签脚本上有什么区别?

文章导读
选哪个主要看你的服务器环境和运维习惯。如果是轻量级 VPS 或需要对接多家云厂商 DNS,acme.sh 更灵活;如果是标准 Linux 发行版且希望官方原生支持,Certbot 更稳妥。
📋 目录
  1. 核心差异分析
  2. 安装与初始配置
  3. 证书申请实操
  4. 自动续期验证与路径
  5. 常见问题与排查
  6. 参考文档
A A

选哪个主要看你的服务器环境和运维习惯。如果是轻量级 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 服务器选择插件:

acme.sh 与 certbot 在 Let's Encrypt 自动续签脚本上有什么区别?
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.com

2. Certbot 申请证书(HTTP 验证)

sudo certbot `--nginx` -d example.com
# 或
sudo certbot `--apache` -d example.com

自动续期验证与路径

1. 续期任务检查

acme.sh 安装时会自动创建 cron 任务。Certbot 安装后通常使用 systemd timer,建议检查状态:

acme.sh 与 certbot 在 Let's Encrypt 自动续签脚本上有什么区别?
systemctl status certbot.timer

2. 手动测试续期

acme.sh 验证:

acme.sh `--cron` `--home` "~/.acme.sh"

Certbot 验证(dry-run 模式):

sudo certbot renew `--dry-run`

3. 证书存储路径

acme.sh 与 certbot 在 Let's Encrypt 自动续签脚本上有什么区别?
  • 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/