一、ACME介绍
acme.sh 是一个使用 ACME 协议的 shell 脚本,主要用于自动获取、续订和安装 SSL/TLS 证书。它是一个轻量级的工具,与 Let's Encrypt 证书颁发机构(CA)以及其他支持 ACME 协议的 CA 兼容。下面是对 acme.sh 的主要特点和功能的介绍:
特点
- 兼容性:兼容 Unix 和类 Unix 系统,包括 Linux、FreeBSD、macOS 等。
- 无依赖:仅依赖于基本的 shell 环境和网络工具,无需安装额外的软件。
- 支持多种模式:支持 HTTP-01、DNS-01 和 TLS-ALPN-01 验证模式,能够在多种环境下工作。
- 集成 DNS API:与许多常见的 DNS 服务提供商的 API 集成,允许自动化 DNS 验证过程。
- 自动化:可以自动续订证书,并且有选项自动安装证书到指定服务,如 Nginx、Apache。
功能
- 证书获取:可以获取单域名、多域名(SAN)和通配符证书。
- 证书续订:自动续订证书,确保证书始终有效
文章来源(Source):浅时光博客 。 - 证书安装:支持自动将证书安装到 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
# 设置acme.sh别名,方便后续使用
alias acme.sh=~/.acme.sh/acme.sh
# 设置 ACME 脚本自动更新
acme.sh --upgrade --auto-upgrade
# 由于默认CA为ZeroSSL,必须先注册帐户才能颁发新证书,这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt
国内服务器
# 克隆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
# 由于默认CA为ZeroSSL,必须先注册帐户才能颁发新证书,这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt
二、生成证书
1、获取DNS厂商API
这里我们需要获取你域名托管的DNS厂商的API授权信息,然后通过acme脚本去调用生成证书,比如我这里的使用的是DNSPod,获取DNSPod的API的ID和密钥信息
提示:每个平台的获取DNS权限的操作都不一样,阿里云平台是需要针对用户给予对应资源进行授权

2、颁发证书
使用 acme.sh 为您的域名颁发通用域名证书。请将 example.com 替换为您的实际域名:
# DNSPod
export DP_Id="<id>"
export DP_Key="<key>"
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_dp:这个选项指定了使用 DNS API 的方式来验证域名的所有权。dns_dp 表示使用 DNSPod 的 DNS API。使用 DNS API 可以自动化验证过程,特别是对于那些不方便修改 DNS 记录的场景。
- -d:参数后跟的是要为其获取 SSL 证书的域名。第一个 -d example.com 指明为 example.com 域名获取证书。第二个 -d
*.example.com指明为 example.com 的所有子域(通过通配符*指定)获取证书。这被称为通配符证书,可以保护无限数量的子域。第一个 -d 后面跟的域名,它会被设置为证书的主要域名(主题备用名称,也称为SAN),通过浏览器在查看证书时显示的证书查看者就是此域名
- 颁发成功后,证书文件将默认保存在
~/.acme.sh/你的域名/目录中

3、安装证书
安装证书到 Nginx。假设 Nginx 的 SSL 证书路径为 /etc/nginx/ (确保这里的目录存在),请执行以下命令:
注意:上面使用了-d参数给几个域名生成了证书,这里安装时同样需要使用-d指定安装证书的域名
acme.sh --install-cert -d "*.example.com" -d "example.com" \
--cert-file /etc/nginx/cert.pem \
--key-file /etc/nginx/key.pem \
--fullchain-file /etc/nginx/fullchain.pem \
--reloadcmd "systemctl force-reload nginx"
- 上面的命令参数介绍
- – -install-cert:此选项告诉 acme.sh 安装获取的 SSL 证书。
- -d:这些参数指定了证书对应的域名。在这个例子中,它指定了通配符域名
*.example.com和根域名example.com。 - –cert-file:指定证书文件的安装路径。在这里,证书将被安装到
/etc/nginx/cert.pem。 - –key-file:指定私钥文件的安装路径。在这里,私钥将被安装到
/etc/nginx/key.pem。 - –fullchain-file:指定完整证书链文件的安装路径。在这里,完整证书链将被安装到
/etc/nginx/fullchain.pem。完整证书链通常包括您的域名证书和中间证书。 - –reloadcmd:定义在安装证书后执行的命令,用于重新加载或重启服务(无需完全重启)以应用新证书。如果你是el6或以下版本,使用
s文章来源(Source):https://dqzboy.com ervice nginx force-reload
4、更新配置
更新 Nginx 配置以使用新的 SSL 证书;这里我的nginx默认配置路径为:/etc/nginx/conf.d/default.conf
~]# vim /etc/nginx/conf.d/default.conf
# 注意修改下面的域名为你的实际域名
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/key.pem;
# 其他配置项...
}
5、重载配置
配置完成之后,我们可以通过下面的指令重新加载配置,使其配置生效
nginx -t
nginx -s reload
6、检查证书
现在我们可以通过浏览器访问域名,并查看证书的相关信息

三、定时更新
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授权问题导致的
这个密钥,阿里云上面叫什么名字,找半天没看到
阿里云在用户管理哪里给对应资源授权,手头没阿里云,自己查下阿里云的文档