使用 Acme 为 Nginx 续签泛域名证书,优势在于结合计划任务与自动化脚本实现全流程省心操作,通过编写包含证书续签、配置检测及 Nginx 平滑重启的脚本,搭配 crontab 定时任务,可按周期自动触发 DNS 验证、证书更新与服务重载,无需人工干预即可确保泛域名证书持续有效,既规避了手动操作疏漏,又以极简流程实现高效运维,让 HTTPS 服务稳定性与管理便捷性完美兼顾。
系统时区设置
- 如果不设置好时区,设置的定时任务无法正常按照要求执行
#设置上海时区
sudo timedatectl set-timezone Asia/Shanghai
域名解析
- 重要的事情多说几句,千万别忘记
#如下方操作解析
请在域名管理处泛域名解析到服务器 你的泛域名 123.456.789
请在域名管理处泛域名解析到服务器 你的泛域名 123.456.789
请在域名管理处泛域名解析到服务器 你的泛域名 123.456.789
设置系统源
- 设置阿里云的软件源,my使用的是CentOS
#安装crul和
sudo yum install curl -y && sudo yum install wget -y
#执行更换
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
#生成缓存
yum makecache
安装nginx
- 设置启用Nginx官方仓库
#设置官方仓库
sudo vi /etc/yum.repos.d/nginx.repo
#在文件中添加以下内容保存生效
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=http://nginx.org/keys/nginx_signing.key
#执行安装
sudo yum install nginx
#启用并启动Nginx
sudo systemctl start nginx
#设置开机启动
sudo systemctl enable nginx
安装Acme.sh
- 执行代码之后数分钟后会显示申请成功,之后复制到nginx目录设置ssl即可,可选的不需要的可以略过
- 其他DNS域名托管商参考这个文档:github.com
#安装acme.sh,安装不成功请使用科学,也可以离线安装
curl https://get.acme.sh | sh
cd /root/.acme.sh
#设置自动更新
./acme.sh --upgrade --auto-upgrade
#可选-查看版本
acme.sh -v
#切换服务商为ZeroSSL
acme.sh --set-default-ca --server zerossl
#关联账户
acme.sh --register-account -m 你的邮箱 --server zerossl
#设置Aliyun api非全局是域名api
export Ali_Key=你KEY
export Ali_Secret=你的ID
#申请泛域名证书
acme.sh --dns dns_ali --issue -d *.你的域名 -d 你的域名 --debug
#创建SSL目录
mkdir -p /etc/nginx/ssl
#手动复制证书到nginx目录
cp /root/.acme.sh/*.你的域名_ecc/* /etc/nginx/ssl/
#可选-查看已申请好的域名证书路径
acme.sh --issue --dns dns_ali --domain *.你的域名 你的域名 --debug
配置Nginx ssl
server {
listen 80;
server_name *.iteuu.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name *.iteuu.com; #这里设置的是泛域名,所有域名都可以
ssl_certificate /etc/nginx/ssl/fullchain.cer; # SSL证书路径
ssl_certificate_key /etc/nginx/ssl/你的泛域名.key; # SSL私钥路径
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
强制续签部署
- 生成一个acme-xq.sh脚本,包含了强制续签安装到nginx的自动化
#!/bin/bash
# 设置日志文件路径
LOG_FILE="/var/log/cert_force_renewal.log"
# 定义日志记录函数
log() {
local message="$1"
echo "$(date): $message" >> "$LOG_FILE"
}
# 强制续签证书
log "Starting certificate force renewal..."
"/root/.acme.sh"/acme.sh --renew -d 你的泛域名 --ecc --force
if [ $? -ne 0 ]; then
log "Certificate renewal failed!"
exit 1
fi
log "Certificate renewal succeeded."
# 复制证书文件到 Nginx 目录
log "Copying certificate files to Nginx directory..."
rm -f /etc/nginx/ssl/*
cp /root/.acme.sh/你的泛域名_ecc/* /etc/nginx/ssl/
if [ $? -ne 0 ]; then
log "Failed to copy certificate files to Nginx directory!"
exit 1
fi
log "Certificate files copied successfully."
# 重新加载 Nginx 服务
log "Reloading Nginx service..."
systemctl reload nginx
if [ $? -ne 0 ]; then
log "Failed to reload Nginx service!"
exit 1
fi
log "Nginx service reloaded successfully."
log "Certificate force renewed and installed to Nginx."
使用计划任务
- 设置脚本执行的日志路径就可以了**,程序会在每月 1 号的凌晨 2 点 30 分执行该任务
# 编辑计划任务
crontab -e
# 填写执行脚本日期,程序会强制续签安装到Nginx
30 2 1 * * /root/acme-xq.sh >> /var/log/acme_renew.log 2>&1


评论区