1.安装组件和脚本

1.1 安装邮件服务

# Ubuntu/Debian 系统
apt-get update && apt-get install msmtp msmtp-mta -y

编写邮件默认服务器:

nano /etc/msmtprc

以下是以阿里企业邮箱为例:

# 设置默认值
defaults
auth           on
tls            on
# 阿里企业邮箱 465 端口必须关闭 starttls
tls_starttls   off
# 如果遇到证书报错,可以暂时关闭校验(生产环境建议开启并指定 trust_file)
tls_certcheck  off
# 开启系统日志
syslog         on

# 你的邮箱配置
account        你的函数定义
host           smtp.qiye.aliyun.com
port           465
from           你的邮箱
user           你的邮箱
# 确保这里是你的阿里邮箱登录密码或专属授权码
password       你的密码

# 设置默认账户
account default : 你的函数定义

因为包含明文密码,所以需要chmod 600 /etc/msmtprc

然后配置完后,测试

printf "Subject: SMTP连接测试\n\n如果收到这封信,说明阿里邮箱配置成功。" | msmtp -a default mail@yuos.top
# mail@yuos.top 是收件人,需要改成你自己的

1.2 安装证书续签服务

curl https://get.acme.sh

2.获取服务商API key

cf为例:
第一步:获取 Cloudflare API Key

登录 Cloudflare Dashboard
点击右上角的 个人资料图标 -> 我的配置文件 (My Profile)
点击左侧菜单的 API 令牌 (API Tokens)
找到 Global API Key(全局 API 密钥),点击 查看 (View),复制那一串代码。

第二步:配置环境变量
在你的服务器终端执行以下两条命令(替换成你自己的信息)。执行后 acme.sh 会加密保存它们,以后无需再次输入:

export CF_Key="你的Global_API_Key"
export CF_Email="你在Cloudflare注册的邮箱"

3.编写自动化脚本

存放位置:/home/cert_renew.sh

#!/bin/bash

# --- 用户配置区 ---
DOMAIN="alidb.eu.org"
EMAIL="mail@yuos.top"                # 接收通知的邮箱
FROM_EMAIL="noreply@yuos.top"        # 必须与 msmtprc 中的 from 一致
TARGET_DIR="/home/crt"               # 目标存放目录
DNS_TYPE="dns_cf"                    # 已修改为 Cloudflare
CA_SERVER="letsencrypt"
# ----------------

# 自动定位 acme.sh 路径
ACME_BIN="$HOME/.acme.sh/acme.sh"

# 创建目标目录
mkdir -p "$TARGET_DIR"

# 获取当前时间
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")

# 定义邮件发送函数 (直接使用 msmtp)
send_mail() {
    local status=$1
    local subject="SSL证书提醒: $DOMAIN"
    # 严格匹配你要求的邮件格式
    local body="--------------
时间:$CURRENT_TIME
操作:续期域名
目标域名:$DOMAIN
状态:$status
--------------"

    # 使用 printf 构造标准邮件头并通过 msmtp 发送
    printf "Subject: %s\nFrom: %s\nTo: %s\n\n%s" \
    "$subject" "$FROM_EMAIL" "$EMAIL" "$body" | msmtp -a default "$EMAIL"
}

# 检查证书状态
NEED_RENEW=false
CERT_FILE="$TARGET_DIR/$DOMAIN.crt"

if [ ! -f "$CERT_FILE" ]; then
    NEED_RENEW=true
else
    # 检查过期时间,如果 30 天内到期则返回非 0
    openssl x509 -checkend $((30*24*3600)) -noout -in "$CERT_FILE"
    if [ $? -ne 0 ]; then
        NEED_RENEW=true
    fi
fi

if [ "$NEED_RENEW" = true ]; then
    # 执行申请命令
    # 使用 --preferred-chain "R13" 尝试获取 R13 品牌链
    $ACME_BIN --issue --dns "$DNS_TYPE" -d "$DOMAIN" \
        --server "$CA_SERVER" \
        --preferred-chain "R13" \
        --force

    if [ $? -eq 0 ]; then
        # 申请成功,执行安装逻辑 (此处会自动完成重命名,去掉 _bundle 等多余字符)
        $ACME_BIN --install-cert -d "$DOMAIN" \
            --cert-file "$TARGET_DIR/$DOMAIN.crt" \
            --key-file  "$TARGET_DIR/$DOMAIN.key" \
            --fullchain-file "$TARGET_DIR/$DOMAIN.pem" \
            --reloadcmd "systemctl reload nginx || systemctl reload apache2"

        if [ $? -eq 0 ]; then
            send_mail "成功"
        else
            send_mail "失败 (证书已申请但安装至目标目录失败)"
        fi
    else
        send_mail "失败 (证书申请过程出错)"
    fi
else
    echo "[$CURRENT_TIME] 证书尚在有效期内且大于30天,无需更新。"
fi

给于执行权限chmod +x /home/cert_renew.sh

4.开启定时任务

crontab -e
# 新增一行
0 0 * * * /bin/bash /home/cert_renew.sh > /dev/null 2>&1

# 校验
crontab -l

#如果存在以下内容,`crontab -e`进去删除即可
35 17 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
最后修改:2026 年 04 月 30 日
如果觉得我的文章对你有用,请随意赞赏