一、ACME介绍
acme.sh 是一个使用 ACME 协议的 shell 脚本,主要用于自动获取、续订和安装 SSL/TLS 证书。它是一个轻量级的工具,与 Let's Encrypt 证书颁发机构(CA)以及其他支持 ACME 协议的 CA 兼容。下面是对 acme.sh 的主要特点和功能的介绍:
特点
- 兼容性:兼容 Unix 和类 Unix 系统,包括 Linux、FreeBSD、mac
原文链接:https://dqzboy.com OS 等。 - 无依赖:仅依赖于基本的 shell 环境和网络工具,无需安装额外的软件。
- 支持多种模式:支持 HTTP-01、DNS-01 和 TLS-ALPN-01 验证模式,
文章来源(Source):https://dqzboy.com 能够在多种环境下工作。 - 集成 DNS API:与许多常见的 DNS 服务提供商的 API 集成,允许自动化 DNS 验证过程。
- 自动化:可以自动续订证书,并且有选项自动安装证书到指定服务,如 Nginx、Apache。
功能
- 证书获取:可以获取单域名、多域名(SAN)和通配符证书。
- 证书续订:自动续订证书,确保证书始终有效。
- 证书安装:支持自动将证书安装到 web 服务器或其他服务。
- DNS API 集成:自动通过 DNS-01 验证,特别有用于无法进行 HTTP 验证的场景,如通配符证书的获取。
- 支持 ECC 和 RSA 证书:可以获取基于 ECC(椭圆曲线加密)和 RSA 的证书。
- 自定义钩子:支持在获取、续订和安装证书的过程中执行自定义脚本。
使用场景
- 在不支持
Let's Encrypt客户端或 Certbot 的环境中获取和管理 SSL/TLS 证书。 - 在需要自动化证书管理的服务器和网站上。
- 在需要特定 DNS 验证或多域名/通配符证书的复杂部署中。
二、ACME安装
国外服务器
说明:默认脚本走的是github地址,所以国内的服务器选择下面的命令进行安装
# 安装 ACME 脚本(邮箱使用真实有效的邮箱)
curl https://get.acme.sh | sh -s email=my@example.com
# 设置acme.sh别名,方便后续使用
alias acme.sh=~/.acme.sh/acme.sh
# 设置 ACME 脚本自动更新
acme.sh --upgrade --auto-upgrade
# 由于默认CA服务器是ZeroSSL,有时可能会导致获取证书的时候一直出现:Pending,这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt
# 关闭关闭自动更新(可选):
acme.sh --upgrade --auto-upgrade 0
国内服务器
# 克隆acme仓库,然后再进行安装
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
# 设置acme.sh别名,方便后续使用
alias acme.sh=~/.acme.sh/acme.sh
# 这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt
二、生成证书
1、获取DNS厂商API
这里我们需要获取你域名托管的DNS厂商的API授权信息,然后通过acme脚本去调用生成证书,比如我这里的使用的是DNSPod,获取DNSPod的API的ID和密钥信息
提示:每个平台的获取DNS权限的操作都不一样,阿里云平台是需要针对用户给予对应资源进行授权

2、颁发证书
使用 acme.sh 为您的域名颁发通用域名证书。请将 example.com 替换为您的实际域名:
注意:生成泛域名证书,必须同时有example.com和 *.example.com。并且example.com必须在前,否则你会发现即使签发成功了也没有任何文件输出
# DNSPod(DP_Id 和 DP_Key 将保存在 ~/.acme.sh/account.conf 中,并在需要时自动获取,无需手动再设置。)
export DP_Id="<DNSPod ID>"
export DP_Key="<DNSPod Token>"
acme.sh --issue --dns dns_dp -d example.com -d '*.example.com'
# Cloudflare
export CF_Key="your_cf_key" //此处替换成你自己的Key
export CF_Email="your_cf_email" //此处填写你给Cloudflare绑定的邮箱账号
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'
上面命令参数介绍:
| 参数 | 作用 | 说明 |
| –issue | 签发证书 | 告诉 acme.sh 要申请/签发新的 SSL 证书 |
| –dns | DNS 验证方式 | 使用 DNS API 验证域名所有权(适合通配符证书) |
| dns_dp | DNSPod 提供商 | 指定使用腾讯云 DNSPod 的 DNS API(dns_dp = DNSPod) |
| -d | 指定域名 | 要申请证书的域名,可多次使用 -d 添加多个域名 |
- 颁发成功后,证书文件将默认保存在
~/.acme.sh/你的域名/目录中

3、安装证书
安装证书到 Nginx。假设 Nginx 的 SSL 证书路径为 /etc/nginx/ (确保这里的目录存在),请执行以下命令:
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "systemctl reload nginx"
上面的命令参数介绍
| 参数 | 作用 | 说明 |
| –install-cert | 安装证书 | 告诉 acme.sh 将已签发的证书复制/安装到指定位置(不是重新申请) |
| -d example.com | 指定主域名 | 选择要安装的证书(对应之前 --issue 时申请的域名) |
| –key-file | 私钥安装路径 | 将证书私钥(.key)复制到此路径,Nginx 的 ssl_certificate_key 指向这里 |
| –fullchain-file | 证书链安装路径 | 将完整证书链(.pem)复制到此路径,Nginx 的 ssl_certificate 指向这里 |
| –reloadcmd | 重载命令 | 证书安装成功后自动执行的命令,用于重载 Web 服务使新证书生效 |
4、更新配置
更新 Nginx 配置以使用新的 SSL 证书;这里我的nginx默认配置路径为:/etc/nginx/conf.d/default.conf
~]# vim /etc/nginx/conf.d/default.conf
# 注意修改下面的域名为你的实际域名
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/key.pem;
# 其他配置项...
}
5、重载配置
配置完成之后,我们可以通过下面的指令重新加载配置,使其配置生效
nginx -t
nginx -s reload
6、检查证书
直接查询服务器当前返回的证书信息,绕过浏览器缓存,看到”真实”的证书状态。
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
可以通过浏览器访问域名,并查看证书的相关信息

通过第三方SSL证书检测机构检测
三、定时更新
acme.sh会自动在服务器的crontab中加一条acme定时任务,从而实现续订证书,并在成功续订后重新加载 Nginx 服务

该定时任务会每日定时检查 1 次,如果证书更新时间已到,则会自动更新并安装证书。 可以通过acme.sh – -list命令查看证书的下次更新时间(见 Renew 列)。

感谢博主的技术分享
acme.sh –issue –dns dns_dp -d “mks.mkboy.top” -d mkboy.top 生成证书,用这个命令,报错429
知道原因,是阿里云上api授权问题导致的
这个密钥,阿里云上面叫什么名字,找半天没看到
阿里云在用户管理哪里给对应资源授权,手头没阿里云,自己查下阿里云的文档