两种方法实现网站证书自动化部署和自动续期

分享 未结
0 15
苟哥
苟哥 2026-08-29 23:44

一、CertGo 桌面客户端(推荐)

5 分钟内完成您的第一个 HTTPS 证书自动化配置。

前提条件

  • 您拥有一个域名

  • 域名使用支持的 DNS 服务商(Cloudflare / 阿里云 / 腾讯云等)

  • 您有一台需要部署证书的 Linux 服务器

步骤 1:安装 CertGo 桌面客户端

请根据您的操作系统下载对应的安装包:

系统下载链接
macOS (Apple Silicon)CertGo-arm64.dmg
macOS (Intel)CertGo-amd64.dmg

步骤 2:创建配置

  1. 打开 CertGo 桌面客户端

  2. 点击「新建配置」

  3. 按向导完成配置:

    • 第 1 步:输入域名(支持通配符如 *.example.com

    • 第 2 步:选择 CA 和 DNS 服务商

    • 第 3 步:配置证书保存路径

    • 第 4 步:测试签发验证配置

在基础配置中填写域名并开始向导,适合作为首个自动化配置入口。

CertGo 基础配置

在集成设置中选择 ACME CA 与 DNS 服务商,完成验证方式与解析授权配置(未配置DNS服务商时先添加服务商)。

未添加服务商状态:

image.png

已添加服务商的状态:

CertGo 集成设置


步骤 3:部署到服务器

  1. 等待测试签发完成

  2. 点击配置管理,选择刚才创建的配置,点击「部署」

  3. 根据部署引导完成部署

部署配置中可选择 Nginx / Apache / Caddy,并设置证书路径与重载命令。

CertGo 部署配置

image.png

步骤4:完成

证书已签发并部署,后续续期由系统自动守护处理。

另外,如果你是用宝塔面板搭建的站点,而且有多个二级域名共享同一个证书,那这时还要做个自动化将证书分别复制到站点所在的证书保存路径。并且证书自动更新的时候,也能同步更新各站点下的证书。具体按以下操作即可:

1、新增脚本文件/www/certgo_sync_bt.sh

#!/bin/bash
set -e

# CertGo YAML配置文件路径 ,请根据实际路径填写!!!!!
YAML_CONFIG="/root/.certgo/configs/example.yaml"  
# 源证书(certgo deploy输出路径),请根据实际路径填写!!!!!
FULLCHAIN_SRC="/etc/nginx/ssl/example.com.pem"
PRIVKEY_SRC="/etc/nginx/ssl/example.com.key"
# 宝塔证书根目录,没特别改动的话,默认是这个路径
BT_CERT_ROOT="/www/server/panel/vhost/cert" 
# 脚本迁移至/www,日志放在/www 
LOG_FILE="/www/certgo_sync.log"

# 校验源证书
if [ ! -f "${FULLCHAIN_SRC}" ] || [ ! -f "${PRIVKEY_SRC}" ];then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')]源证书文件不存在,退出" >> "${LOG_FILE}"
    exit 0
fi

# 解析yaml,提取certificate.domains下全部域名
DOMAINS=$(grep -A20 "certificate:" "${YAML_CONFIG}" \
    | grep -E '^\s*- ' \
    | sed -E 's/^\s*-\s*//')

CHANGED=0

for domain in ${DOMAINS}; do
    DST_DIR="${BT_CERT_ROOT}/${domain}"
    FULLCHAIN_DST="${DST_DIR}/fullchain.pem"
    PRIVKEY_DST="${DST_DIR}/privkey.pem"

    mkdir -p "${DST_DIR}"

    if ! cmp -s "${FULLCHAIN_SRC}" "${FULLCHAIN_DST}" || ! cmp -s "${PRIVKEY_SRC}" "${PRIVKEY_DST}" ; then
        cp "${FULLCHAIN_SRC}" "${FULLCHAIN_DST}"
        cp "${PRIVKEY_SRC}" "${PRIVKEY_DST}"
        chmod 644 "${FULLCHAIN_DST}"
        chmod 600 "${PRIVKEY_DST}"
        echo "[$(date '+%Y-%m-%d %H:%M:%S')]同步证书至 ${domain}" >> "${LOG_FILE}"
        CHANGED=1
    fi
done

# 有证书更新,仅重载一次宝塔Nginx
if [ ${CHANGED} -eq 1 ]; then
    /www/server/nginx/sbin/nginx -t
    if [ $? -eq 0 ];then
        /www/server/nginx/sbin/nginx -s reload
        echo "[$(date '+%Y-%m-%d %H:%M:%S')]全部域名证书同步完成,Nginx重载成功" >> "${LOG_FILE}"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')]Nginx配置检测失败,跳过reload" >> "${LOG_FILE}"
        exit 1
    fi
fi

2、赋予可执行权限,手动测试运行

chmod +x /www/certgo_sync_bt.sh
#执行脚本测试
/www/certgo_sync_bt.sh
#查看日志
cat /www/certgo_sync.log
#校验证书目录是否生成
ls -la /www/server/panel/vhost/cert/

3、设置定时任务,自动更新证书(重点!更新脚本路径)


1)、进入宝塔计划任务

登录宝塔 → 左侧菜单【计划任务】→ 右上角【添加任务】宝塔面板

2)、填写任务参数

  • 任务类型:Shell脚本

  • 任务名称:填写 CertGo证书同步宝塔Nginx

  • 执行周期:选择 N小时

含义:每 1 小时,第 0 分钟(整点)执行,等价 0 * * * *

    • 小时:1

    • 分钟:0



  • 执行用户:root(必须 root,否则读不到 certgo 配置文件)

  • 脚本内容:直接写完整命令调用已经写好的脚本文件

/www/certgo_sync_bt.sh

注意:不要把整个 shell 脚本粘贴在这里!脚本已经保存在 /www/certgo_sync_bt.sh,这里只写调用命令。

点击【添加任务】保存。

3)、测试任务是否可用

在计划任务列表,找到刚创建的任务,点右侧【执行】按钮,手动运行一次。

执行完看日志:点击【日志】,查看输出。 同时服务器上查看日志确认:

cat /www/certgo_sync.log

4)、核对关键点

  • 脚本权限确认:

chmod +x /www/certgo_sync_bt.sh

  • 执行用户必须是root,否则无法读取 /root/.certgo/下面的 yaml 配置。

  • certgo daemon 服务依旧由 systemd 托管,宝塔计划任务只管同步证书,不负责申请证书。

如果想要每 30 分钟检测一次(可选)

编辑该计划任务,执行周期改为:

  • N分钟,填 30脚本内容不变。



二、acme.sh脚本的方式

1. 准备工作

在开始之前,请前往 ACME 账号管理 页面获取您的EAB KID 和EAB MAC Key

2. 安装 acme.sh

使用官方安装脚本进行安装(请将 email 替换为您的真实邮箱,用于接收证书过期通知):

curl https://get.acme.sh | sh -s email=461960962@qq.com
安装完成后,您可能需要重新加载 Shell 配置文件:
source ~/.bashrc

3. 注册 EAB 账户

使用之前获取的 EAB 信息注册账户。此步骤只需执行一次Register Account

acme.sh --register-account --server https://acme.litessl.com/acme/v2/directory \
  --eab-kid "YOUR_KID" \
  --eab-hmac-key "YOUR_MAC_KEY"

4. 申请证书

方式 A: DNS 验证 (推荐,支持通配符)

以阿里云为例,首先导出 API Key:

export Ali_Key="YOUR_ACCESSKEY_ID"
export Ali_Secret="YOUR_ACCESSKEY_SECRET"

然后执行申请命令:

acme.sh --issue --server https://acme.litessl.com/acme/v2/directory --dns dns_ali -d "example.com" -d "*.example.com"


方式 B: HTTP 验证

需要指定网站根目录(Webroot):

acme.sh --issue --server https://acme.litessl.com/acme/v2/directory -w /home/wwwroot/example.com -d "example.com"

5. 部署与安装

注意

请勿直接使用 ~/.acme.sh/ 目录下的证书文件,因为它们可能会在内部结构更改时发生变化。请使用 --install-cert 命令。

将证书安装到 Nginx/Apache 目录,并配置自动重载Deploy to Nginx

acme.sh --install-cert -d "example.com" \
  --key-file       /etc/nginx/ssl/example.com.key  \
  --fullchain-file /etc/nginx/ssl/fullchain.cer \
  --reloadcmd     "service nginx force-reload"

6. 自动续期

acme.sh 会自动为您配置 crontab 定时任务,每天检查证书是否需要续期。 无需任何额外操作。您可以通过 crontab -l 查看任务。



收藏
回帖
  • 消灭零回复