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.sh2.获取服务商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