宝塔面板上ssl证书自动续签教程–通过acme.sh实现

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