简介
acme.sh 是一个开源的 ACME 协议的客户端工具,用于自动化申请、更新和部署 SSL/TLS 证书。通过使用 acme.sh,用户可以轻松地在服务器上设置 HTTPS 加密连接,而无需手动操作。它支持多种 DNS 接口和证书颁发机构,可以与各种 Web 服务器和 DNS 服务集成,提供了方便的命令行工具和丰富的功能选项。目前 acme.sh 支持 5 个正式环境 CA,分别是 Let’s Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL。
链接:https://github.com/acmesh-official/acme.sh
配置安装
使用源码安装:
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m username@example.com
请注意替换 username@example.com 为你自己的邮箱,避免无法收到上游证书的邮件通知。
安装完成后重新加载 Bash:
source ~/.bashrc
开启自动更新:
acme.sh --upgrade --auto-upgrade
选择默认 CA
目前 acme.sh 支持 5 个正式环境 CA,分别是 Let’s Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL,如果需要更换可以使用如下命令:
切换 Let’s Encrypt:
acme.sh --set-default-ca --server letsencrypt
切换 Buypass:
acme.sh --set-default-ca --server buypass
切换 ZeroSSL:
acme.sh --set-default-ca --server zerossl
切换 SSL.com:
acme.sh --set-default-ca --server ssl.com
切换 Google Public CA:
acme.sh --set-default-ca --server google
如果已有 ZeroSSL 帐号,可以在后台控制面板拿到 API Key,然后执行如下命令:
apt install jq
curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=你的API_Key" | jq
输出内容如下:
{
"success": true,
"eab_kid": "kid字符串",
"eab_hmac_key": "hmac_key字符串",
}
然后手动添加帐号:
acme.sh --register-account --server zerossl \
--eab-kid kid字符串 \
--eab-hmac-key hmac_key字符串
Google Public CA 需要按照官方博客申请内测,然后获取 Key。
ps:本篇文章使用Let’s Encrypt来做讲解。
使用DNS API部署
准备 DNS API
通过使用域名服务商提供的 API 密钥,让acme.sh自动创建域名验证记录以申请域名证书. acme.sh 支持全球各种域名服务商的 API ,本文将以阿里云为例.更多 DNS API 支持,请查看https://github.com/acmesh-official/acme.sh/wiki/dnsapi
登陆阿里云控制台 - 访问控制 RAM - 身份管理-用户
创建一个新用户:
勾选API调用访问:
复制保存好生成的AccessKey信息
授权该用户,搜索DNS,并将AliyunDNSFullAccess移动至右侧确定
根据官方dnsapi获取阿里云的API格式为:
export Ali_Key="LTAI4Fd8J9qs4fxxxxxxxxxx"
export Ali_Secret="Xp3Z7NDOW0CJcPLKoUwqxxxxxxxxxx"
配置 DNS API
acme.sh 程序目录为隐藏目录.acme.sh存放在当前用户家目录下.执行以下命令进入目录,并编辑account.conf,根据上文获取的 API 格式,复制粘贴到文件中保存.
cd ~/.acme.sh
vim account.conf
ps:目前 account.conf 仅支持一个 DNS API ,多个域名服务商的域名需单独加 --accountconf 参数: 相关 issues 链接https://github.com/acmesh-official/acme.sh/issues/2055
申请证书
自动 DNS 模式标准命令:
acme.sh --issue --server letsencrypt --dns dns_ali -d example.com -d www.example.com
acme.sh:是一个用于管理 SSL 证书、自动续订证书的工具。
–issue:表示要申请证书。
–server letsencrypt:指定使用 Let’s Encrypt 作为证书颁发机构。
–dns dns_ali:指定使用 DNS 验证的方式来验证域名所有权,其中 dns_ali 表示阿里云 DNS 的插件,用于自动化 DNS TXT 记录的添加。
-d example.com -d www.example.com:指定要申请证书的域名,这里是 example.com 和 www.example.com。在申请通配符证书时,需要使用 -d ‘*.example.com’ 这样的格式指定。
使用DNS验证生成证书(包含中间证书)
acme.sh --issue --dns dns_ali -d *.test.com --fullchain-file /home/ecs-user/test.pem --key-file /home/ecs-user/test.key
acme.sh:是一个用于管理 SSL 证书、自动续订证书的工具。
–issue:表示要申请证书。
–dns dns_ali:指定使用 DNS 验证的方式来验证域名所有权,其中 dns_ali 表示阿里云 DNS 的插件,用于自动化 DNS TXT 记录的添加。
-d *.test.com:指定要申请证书的域名,这里是 *.test.com,表示匹配所有 test.com 域名下的子域名。
–fullchain-file /home/ecs-user/test.pem:指定存储完整证书链的文件路径,证书链包括证书以及中间证书。
–key-file /home/ecs-user/test.key:指定存储私钥的文件路径。
这行命令的作用是通过阿里云的 DNS 服务来验证域名所有权,并向 Let’s Encrypt 申请一个包含 *.test.com 的通配符 SSL 证书,然后将证书链存储到 /home/ecs-user/test.pem 文件中,将私钥存储到 /home/ecs-user/test.key 文件中。
自动部署
acme.sh 还支持自动部署证书到指定目录并重启nginx或apache服务,以确保新证书生效.官方参考如下:
acme.sh --installcert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
nginx.conf配置如下:
验证证书安全等级
链接:https://www.ssllabs.com/
访问上面的链接,点击test you server,然后输入需要验证的域名:
下图是我的验证结果:
使用 HTTP 验证签发证书
首先我们要做一下准备工作,假设你域名是 example.com,解析到你的服务器让其生效后,我们建立一个目录:
mkdir -p /var/www/letsencrypt
我们的目的是绑定 http://example.com/.well-known/acme-challenge 到这个目录。
如果用的 Nginx,那么新建一个配置文件:
server {
listen 80;
listen [::]:80;
server_name example.com;
location /.well-known/acme-challenge {
root /var/www/letsencrypt;
}
location / {
rewrite ^/(.*)$ https://$host/$1 permanent;
}
}
我们以 Let’s Encrypt 为例,直接在终端运行:
acme.sh --issue -d example.com -w /var/www/letsencrypt
如果希望签发 ECC 证书,则运行
acme.sh --issue -d example.com --keylength ec-256 -w /var/www/letsencrypt
如果需要多个域名,则运行
acme.sh --issue -d example.com -d example.org -w /var/www/letsencrypt
自动化签发部署
ps:DNS验证版
使用脚本实现自动化
#!/bin/bash
# 备份旧证书
cp /etc/nginx/cert/* /sslbak/
# 使用 acme.sh 生成新证书
acme.sh --issue --dns dns_ali -d *.test.com --fullchain-file /home/ecs-user/test.pem --key-file /home/ecs-user/test.key --force
# 将新证书拷贝到 Nginx 证书目录
cp /home/ecs-user/test.pem /etc/nginx/cert/
cp /home/ecs-user/test.key /etc/nginx/cert/
# 重启 Nginx 以应用新证书(请根据实际情况选择适当的重启方式)
systemctl reload nginx
设置定时任务
echo "0 0 1 */2 * root /bin/bash /path/to/script.sh" >> /etc/crontab