1、安装acme.sh
在终端运行以下命令,其中your@example.com替换为自己的邮箱:
curl https://get.acme.sh | sh -s email=your@example.com
2、签发证书
命令:
acme.sh --issue -d mydomain.com --webroot /www/wwwroot/mydomain.com/
其中mydomain.com替换为需要签发证书的域名,而‘/www/wwwroot/mydomain.com/’替换为对应站点所在目录。签发成功后,效果大致如下:
若签发失败,可运行以下命令将ssl提供商修改为Let's Encrypt:
acme.sh --set-default-ca --server letsencrypt
3、复制新的证书替换原有的ssl证书
acme.sh --install-cert -d mydomin.com \ --key-file /www/server/panel/vhost/cert/mydomin.com/privkey.pem \ --fullchain-file /www/server/panel/vhost/cert/mydomin.com/fullchain.pem \ --reloadcmd "service nginx reload"
其中,‘mydomin.com’为证书对应的域名,key-file和fullchain-file在网站的如下位置获取。key-file对应的是‘ ssl_certificate_key’,fullchain-file对应的是‘ssl_certificate’。
4、反向代理的网站续签设置(可选)
如果网站设置了反向代理,就无法直接一键续签,可以在宝塔面板站点设置(如下图位置)添加如下代码,其中ip替换为自己的真实ip即可:
#绕开反向代理续签证书
location /.well-known/acme-challenge/ {
allow all;
proxy_pass http://your-ip;
proxy_set_header Host $host; # 转发主机头
}
5、自动续签ssl
5.1操作
ssl证书每隔30天会自动续签,但是并不会自动复制证书到nginx。这样属于自动了个寂寞,为了实现真正的自动,可以添加一个计划任务,每天更新证书。
操作:到宝塔面板–计划任务中,添加一个shell脚本,每天执行即可。脚本如下
#!/bin/bash # 1. 定义绝对路径 ACME_BIN="/root/.acme.sh/acme.sh" CONFIG_HOME="/root/.acme.sh" # 2. 提取并清洗域名列表,逻辑:获取目录名 -> 过滤掉系统目录 -> 去掉 _ecc 后缀 -> 唯一化处理 domains=$(ls -d $CONFIG_HOME/*/ | xargs -n 1 basename | grep -vE "^(\.|ca|http\.header|deploy|dnsapi|notify)" | sed 's/_ecc$//' | sort -u) # 输出获取到的域名(调试用) echo "$domains" # 3. 开始循环处理 for domain in $domains; do echo "🚀 正在处理: $domain" TARGET_DIR="/www/server/panel/vhost/cert/$domain" mkdir -p "$TARGET_DIR" $ACME_BIN --install-cert -d "$domain" \ --home "$CONFIG_HOME" \ --key-file "$TARGET_DIR/privkey.pem" \ --fullchain-file "$TARGET_DIR/fullchain.pem" if [ $? -eq 0 ]; then echo "✅ 域名 $domain 证书导出成功" else echo "❌ 域名 $domain 证书导出失败" fi done echo "📢 所有操作完成,正在重启 Nginx..." service nginx reload
5.2注意
这种续签方法仅适用于‘站点名称’和‘域名’相同的ssl证书申请,如果二者不同,可以考虑通过新建站点实现一致
6、常用命令
6.1 查看当前所有证书列表
acme.sh --list
6.2 手动续签证书(仅续签未复制)
acme.sh --renew -d mydoin.com --force


