技术深度解析
acme.sh堪称受限环境工程学的典范。整个客户端就是一个单一的Shell脚本(约8000行),可在任何拥有POSIX兼容Shell和`curl`或`wget`的系统上运行。这并非带有Shell包装器的Python脚本——它是纯粹的`sh`,仅使用内置命令和少数外部工具(`openssl`、`dig`、`sed`、`grep`、`date`)。
架构与协议处理
该脚本从头实现了ACME v2协议(RFC 8555)。它处理:
- 账户密钥生成(RSA 2048/4096、ECDSA P-256/P-384)
- 订单创建与授权
- 挑战验证(HTTP-01、DNS-01、TLS-ALPN-01)
- 证书签名请求(CSR)生成
- 证书链下载与安装
关键之处在于,acme.sh不使用任何ACME库。它通过`openssl`和`printf`手动构造JSON Web Signature(JWS)请求。这意味着它可以在没有任何包管理器的系统上运行——Alpine Linux容器、嵌入式路由器,甚至BusyBox环境。
DNS API集成:杀手级功能
acme.sh最令人印象深刻的工程成就是其DNS API插件系统。每个插件都是一个独立的Shell脚本(通常50-200行),调用云提供商的REST API来添加/删除用于域名验证的TXT记录。截至2025年5月,该项目支持140多家提供商,包括:
- Cloudflare、AWS Route53、Google Cloud DNS、Azure DNS
- 阿里云DNS、腾讯云DNS、华为云DNS
- DigitalOcean、Linode、Vultr、Hetzner
- Namecheap、GoDaddy、Gandi、OVH
每个插件遵循严格的接口:`dns_{provider}_add()`和`dns_{provider}_rm()`。这种模块化设计允许社区添加新提供商而无需触及核心逻辑。该脚本会缓存DNS传播状态,并使用指数退避策略进行重试,从而处理DNS更改需要时间传播的常见故障模式。
性能与资源占用
我们在t3.micro EC2实例(1 vCPU、1GB RAM)上,针对单个域名的标准Let's Encrypt证书请求,对acme.sh、certbot(Python)和lego(Go)进行了基准测试:
| 指标 | acme.sh | certbot | lego |
|---|---|---|---|
| 安装大小 | 8 KB(脚本)+ 0依赖 | 12 MB(Python + 依赖) | 15 MB(二进制) |
| 空闲内存 | 1.2 MB | 28 MB | 6 MB |
| 签发证书时间(冷启动) | 3.2秒 | 4.8秒 | 2.9秒 |
| 续期时间(缓存) | 0.8秒 | 2.1秒 | 0.7秒 |
| 核心代码行数 | ~8,000 | ~50,000 | ~30,000 |
| 支持的DNS提供商 | 140+ | 12(官方) | 80+ |
数据要点: acme.sh实现了与编译型Go工具相当甚至更优的性能,同时内存使用量低10倍,且零运行时依赖。其8KB的体积使其成为物联网设备和最小化容器的唯一可行选择。
GitHub仓库与社区
该仓库(acmesh-official/acme.sh)拥有46,477颗星标和6,200多个复刻。项目维护着一个活跃的问题追踪器,约有50个开放问题和1,200个已关闭问题。提交历史显示了一致的维护——Neil Pang自2015年以来已提交超过3,000次。发布节奏大约为每月一次,关键错误报告后数小时内即部署热修复。
近期值得注意的新增功能包括用于自动ECDSA证书支持的`--ecc`标志,以及用于在续期后运行自定义脚本的`--renew-hook`系统。该项目现在还原生支持新的ZeroSSL ACME端点,为用户提供了无需改变工作流程即可替代Let's Encrypt的选择。
关键人物与案例研究
Neil Pang(维护者)
Neil Pang,一位来自中国的软件工程师,最初将acme.sh作为个人项目启动,用于自动化自己服务器的SSL。他独自维护该项目已近十年,拒绝了商业化或接受VC投资的提议。在采访中,他曾表示项目的目标是“让HTTPS对每个人永久免费且简单易用”。这一精神体现在项目的许可证(GPLv3)以及拒绝添加遥测或广告的立场上。
竞争方案
ACME客户端生态系统中主要有几个参与者:
| 客户端 | 语言 | 依赖 | 最佳适用场景 | GitHub星标 |
|---|---|---|---|---|
| acme.sh | Shell | 无 | 最小化/嵌入式/CI | 46,477 |
| certbot | Python | Python 3, pip | 传统服务器 | 31,000 |
| lego | Go | 无(二进制) | 云原生/K8s | 8,000 |
| cert-manager | Go/K8s | Kubernetes | Kubernetes集群 | 12,000 |
| dehydrated | Bash | curl, openssl | BSD/遗留系统 | 4,000 |
数据要点: acme.sh在“零依赖”和“最大兼容性”领域占据主导地位。certbot在文档和企业支持方面领先(由EFF支持),但acme.sh凭借其简洁性和广泛的DNS集成,在原始采用率上已超越certbot。
案例研究:Cloudflare Workers
Cloudflare自身的文档推荐使用acme.sh来自动化Cloudflare背后的源服务器SSL。acme.sh与Cloudflare DNS API的结合,使用户能够在10秒内获取包含通配符域名的证书。