acme.sh 域名证书申请指南
acme.sh 是一个纯 Shell 编写的 ACME 协议客户端,用于自动化申请和续期免费 SSL 证书(Let’s Encrypt、ZeroSSL 等)。本文整理常用操作指南,帮助快速上手。
一、证书限制说明
限制主要来自对接的 CA 机构(Let’s Encrypt/ZeroSSL 等),脚本本身无额外限制:
| 限制类型 | 说明 |
|---|---|
| 有效期 | 免费证书默认 90 天,acme.sh 会自动在 30 天时续期;2026 年起 CA/B 论坛要求最长有效期缩短至 47 天 |
| 泛域名范围 | *.example.com 仅对二级域名生效,多级泛域名(如 *.api.example.com)需单独申请 |
| ZeroSSL 通道 | ZeroSSL 官网免费用户限 3 个证书,通过 acme.sh 走 ACME 协议无此数量限制 |
| 密钥类型 | Let’s Encrypt 暂不支持 ECDSA P-521(ec-521),仅支持 ec-256/ec-384 和 RSA 系列 |
| CA 通用限制 | 免费证书均为 DV 级,无 OV/EV 级;不支持纯 IP 地址申请,仅支持合法解析的域名 |
二、申请时的关键要求
1. 域名所有权验证
| 验证模式 | 要求 | 适用场景 |
|---|---|---|
| Webroot/Standalone/Apache/Nginx | 域名公网可访问,80/443 端口未被占用(部分模式需 root 权限) | 公网服务器 |
| DNS API 模式 | 域名商支持 API 并配置密钥,可全自动验证 | 推荐,内网/封闭端口 |
| DNS 手动模式 | 手动添加 TXT 解析,无法自动续期 | 临时申请 |
2. 权限/环境要求
- 无需 root 但建议使用,Webroot 模式需对网站根目录有写入权限
- 依赖 curl、openssl 等基础工具,Windows 需搭配 Cygwin 环境
3. 证书使用规范
- 生成的证书默认存于
~/.acme.sh/,不可直接使用,需通过--install-cert命令复制到服务目录 - 安装时必须配置
--reloadcmd,否则证书续期后服务不会加载新证书
4. 其他要求
- 多域名证书需所有域名绑定同一 webroot 目录
- 申请时需填写有效邮箱,用于证书过期/异常通知
三、常用申请命令
1. Nginx 模式(最常用)
适合 Nginx 正在运行且 80/443 端口正常的场景:
acme.sh --issue -d 你的域名.com -d www.你的域名.com --nginx特点:
- ✅ 80、443 端口必须正常开着、被 Nginx 占用
- ✅ acme.sh 会自动改配置、验证、改回去,不用停服务
2. Webroot 模式
适合网站正在运行且有写入权限的场景:
acme.sh --issue -d 你的域名.com --webroot /var/www/html特点:
- ✅ 80 端口必须被占用(正常运行)
- ✅ 需要对网站根目录有写入权限
3. DNS API 模式(推荐)
适合内网服务器、封闭端口或追求全自动的场景,完全不需要 80/443 端口:
# 以阿里云为例
export Ali_Key="你的 AccessKey ID"
export Ali_Secret="你的 AccessKey Secret"
acme.sh --issue --dns dns_ali -d gt.tech -d *.gt.tech特点:
- ✅ 完全不需要 80/443 端口
- ✅ 内网服务器、封闭端口、本地机器都能申请
- ✅ 支持自动续期
4. DNS 手动模式
适合临时申请,不想配置 API 的场景:
acme.sh --issue -d example.com -d "*.example.com" --dns manual执行后会输出 TXT 记录值,需到域名后台添加:
_acme-challenge.example.com. IN TXT "xxxxxxxxxxxx"添加后等待 1-5 分钟,执行续期命令完成签发:
acme.sh --renew -d "你的域名.com" --yes-I-know-dns-manual-mode-enough-go-ahead-please特点:
- ✅ 支持所有域名商,不需要 API
- ✅ 完全不用 80/443 端口
- ❌ 不能自动续期,每 60 天要手动再跑一次
四、泛域名证书申请
前提条件
- 有一个域名(如
abc.com) - 能进域名控制台添加 TXT 记录
- 已经装好 acme.sh
完整步骤(以阿里云 DNS API 为例)
1. 获取阿里云 API 密钥
- 登录阿里云 → 右上角头像 → AccessKey 管理
- 创建子用户(推荐,更安全)
- 权限添加:AliyunDNSFullAccess
- 记下
AccessKey ID和AccessKey Secret
2. 配置密钥到服务器
export Ali_Key="你的阿里云 AccessKey ID"
export Ali_Secret="你的阿里云 AccessKey Secret"3. 申请泛域名证书
acme.sh --issue \
--dns dns_ali \
-d gt.tech \
-d *.gt.tech说明:
- 同时申请
gt.tech(主域名)和*.gt.tech(泛域名) - 全自动 DNS 验证,不用手动加解析
- 不需要 80/443 端口
- 以后自动续期
4. 安装证书到 Nginx(必须执行)
acme.sh --install-cert -d gt.tech \
--key-file /etc/nginx/ssl/gt.tech.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl reload nginx"五、Nginx 配置
1. 所有子域名共用同一站点
适合所有子域名都指向同一个前端/后端服务的场景:
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name gt.tech *.gt.tech;
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl;
server_name gt.tech *.gt.tech;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/gt.tech.key;
# SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 业务配置
root /var/www/html;
index index.html index.htm;
}效果:
- 访问
https://gt.tech(无前缀主域名)正常打开 - 访问
https://www.gt.tech、https://api.gt.tech、https://xxx.gt.tech全部正常匹配 - 证书对所有子域名都有效
- 以后加新子域名,只需在域名商解析到服务器 IP,不用改 Nginx 配置
2. 不同子域名对应不同服务
适合 www 做官网、api 做后端、test 做测试环境的场景:
# 全局 HTTP 跳转 HTTPS
server {
listen 80;
server_name gt.tech *.gt.tech;
return 301 https://$host$request_uri;
}
# 主域名+www:官网
server {
listen 443 ssl;
server_name gt.tech www.gt.tech;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/gt.tech.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
root /var/www/official-website;
index index.html;
}
# api 子域名:后端接口
server {
listen 443 ssl;
server_name api.gt.tech;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/gt.tech.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# test 子域名:测试环境
server {
listen 443 ssl;
server_name test.gt.tech;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/gt.tech.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
root /var/www/test-env;
index index.html;
}六、验证步骤
1. 测试配置语法
nginx -t显示 test is successful 说明配置无错误。
2. 重载 Nginx
systemctl reload nginx3. 验证证书是否匹配
openssl s_client -connect test.gt.tech:443 -servername test.gt.tech 2>/dev/null | openssl x509 -noout -text | grep DNS正常会输出 DNS:gt.tech, DNS:*.gt.tech,说明证书对所有子域名有效。
七、常见问题
换域名/新增域名
直接重新申请即可:
acme.sh --issue -d 新域名.com -d www.新域名.com --nginx端口占用问题总结
| 模式 | 80/443 端口要求 |
|---|---|
--nginx / --apache | ✅ 必须正常开着、被占用 |
--webroot | ✅ 必须被占用(正常运行) |
--standalone | ❌ 必须是空的、没被占用 |
--dns | ✅ 完全不需要 |
泛域名证书覆盖范围
申请 *.gt.tech 后:
- ✅ 支持:
www.gt.tech、api.gt.tech、abc.gt.tech(所有二级域名) - ✅ 支持:
gt.tech(主域名,需同时申请-d gt.tech) - ❌ 不支持:
demo.www.gt.tech、a.b.gt.tech(三级及以上域名)
证书共用
一张证书同时包含主域名和泛域名时:
acme.sh --issue --dns dns_ali -d gt.tech -d *.gt.tech这张证书同时支持:
gt.tech(无前缀主域名)www.gt.tech、api.gt.tech等所有二级域名
一套证书,全部通用,无需分开申请。
八、acme.sh 的核心价值
acme.sh 是免费 SSL 证书自动化的事实标准工具,功能无夸大,所有特性均为实际运维所需:
| 优势 | 说明 |
|---|---|
| 轻量无依赖 | 纯 Shell 脚本,无 Python/PHP 依赖,跨所有主流 OS/服务器 |
| 自动化核心 | 全程无需人工干预,自动申请、续期、重载服务 |
| 生态兼容性 | 支持所有 RFC8555 合规 CA、数十家 DNS 商 API、所有主流服务 |
| 无商业化捆绑 | 开源 GPLv3 协议,由 ZeroSSL 官方维护,无广告/收费插件 |
简单说,acme.sh 解决了免费证书频繁续期的痛点,是运维标配工具。
Last updated on