当前位置: 首页 > news >正文

阿里云服务器采用crontab定时任务使acme.sh全自动化申请续签免费SSL证书,并部署在Linux宝塔网站和雷池WAF

阿里云服务器安装Linux宝塔面板用于部署网站,又安装了雷池WAF用于防护网站,网站访问正常。可以参考文章:Linux服务器安装Linux宝塔面板并部署wordpress网站以及雷池WAF

本文介绍使用 acme.sh 通过 DNS API 全自动申请和续签免费Let’s Encrypt SSL 证书,本文只做单域名详细介绍。

一、安装 acme.sh

1.使用SSH远程登陆阿里云服务器,本文以root账户登陆介绍,your_email@example.com替换成自己邮箱即可。

# 使用一键脚本安装
curl https://get.acme.sh | sh -s email=your_email@example.com

在这里插入图片描述
从上面可以看到acme.sh安装到了路径/root/.acme.sh/acme.sh

2.重新加载环境变量和切换CA证书类型

# 重新加载环境变量
source ~/.bashrc#  CA证书类型默认使用ZeroSSL,切换成Let's Encrypt
acme.sh --set-default-ca --server letsencrypt

3.安装成功后,终端输入acme.sh -h便可以看到帮助命令。

二、配置阿里云DNS API

1.通过阿里云服务器提供的API,让acme.sh自动创建域名验证记录以申请域名证书。首先登陆阿里云控制台 - 访问控制 RAM - 身份管理 - 用户 - 创建用户

在这里插入图片描述
2.填写登录名称,勾选使用永久AccessKey访问,确定
在这里插入图片描述

在这里插入图片描述
完成后,分别复制AccessKey IDAccessKey Secret的值,保存并一定做好备份!

3.按照下图,选中这个用户,点击下方的添加权限。搜索DNS,选择AliyunDNSFullAccess点击确认添加权限
在这里插入图片描述
4.在终端中配置环境变量(复制到终端中执行):

export Ali_Key="LTAI5txxxxxxxxxxxxx"
export Ali_Secret="TJHStNFrxxxxxxxxxxxxxxxxxxx"
三、申请SSL证书

本文只介绍单域名证书申请命令:(本例演示域名:www.test.com,使用时替换为自己域名即可。)

/root/.acme.sh/acme.sh --issue --dns dns_ali -d www.test.com

命令解析

  • /root/.acme.sh/acme.sh:这是 acme.sh 客户端的安装路径。通常情况下,acme.sh 会安装在用户的主目录下的 .acme.sh 文件夹中。
  • --issue:表示申请证书。
  • --dns dns_ali:指定使用阿里云的 DNS API 来验证域名所有权。dns_aliacme.sh 内置的阿里云 DNS 插件。
  • -d www.test.com:指定要申请证书的域名, 本例演示域名:www.test.com,使用时替换为自己域名即可。
四、部署SSL证书到Web服务器(Linux宝塔面板)

存放acme申请签发的SSL证书目录(root账户的家目录是/root),acme默认安装路径/root/.acme.sh/acme.sh
SSL证书默认存储在 ~/.acme.sh/www.test.com_ecc/,用root账户登陆,所以SSL证书默认存储在/root/.acme.sh/www.test.com_ecc/,
acme申请签发的SSL证书-密钥(KEY)文件路径: /root/.acme.sh/www.test.com_ecc/www.test.com.key;acme申请签发的SSL证书-证书(cer)文件路径: /root/.acme.sh/www.test.com_ecc/fullchain.cer

但需手动执行命令复制到Web 服务器目录。

注意:确保证书存放的目录已创建

在部署SSL证书之前,我们首先要确定原有ssl证书的位置。一般在你的nginx配置文件中,登陆Linux宝塔面板后台可以查看:

在这里插入图片描述

可以看到ssl证书的路径:(本例演示域名:www.test.com68.162.x.x是服务器IP,也是网站根目录名称。)

ssl_certificate    /www/server/panel/vhost/cert/68.162.x.x/fullchain.pem;
ssl_certificate_key    /www/server/panel/vhost/cert/68.162.x.x/privkey.pem;

所以部署SSL证书到 Web 服务器(Linux宝塔面板)命令如下:

/root/.acme.sh/acme.sh --install-cert -d www.test.com \
--key-file "/www/server/panel/vhost/cert/68.162.x.x/privkey.pem"  \
--fullchain-file "/www/server/panel/vhost/cert/68.162.x.x/fullchain.pem" \
--reloadcmd "service nginx force-reload"

这段命令是用于安装 SSL 证书的,具体是通过 acme.sh 脚本将 Let’s Encrypt 颁发的 SSL 证书安装到指定的路径,并重新加载 Nginx 服务以使证书生效。以下是命令的详细解释:

命令解析

  1. /root/.acme.sh/acme.sh --install-cert -d www.test.com

    • /root/.acme.sh/acme.sh:指定 acme.sh 脚本的路径。acme.sh 是一个用于自动化申请和管理 Let’s Encrypt SSL 证书的工具。
    • --install-cert:表示安装证书。
    • -d www.test.com:指定需要安装证书的域名,这里是 www.test.com,本例演示域名:www.test.com,使用时替换为自己域名即可。
  2. --key-file "/www/server/panel/vhost/cert/68.162.x.x/privkey.pem"

    • --key-file:指定私钥文件的路径。
    • "/www/server/panel/vhost/cert/68.162.x.x/privkey.pem":私钥文件的完整路径。privkey.pem 是 Let’s Encrypt 颁发的私钥文件。
  3. --fullchain-file "/www/server/panel/vhost/cert/68.162.x.x/fullchain.pem"

    • --fullchain-file:指定证书链文件的路径。
    • "/www/server/panel/vhost/cert/68.162.x.x/fullchain.pem":证书链文件的完整路径。fullchain.pem 是包含证书和中间证书的文件。
  4. --reloadcmd "service nginx force-reload"

    • --reloadcmd:指定在证书安装完成后需要执行的命令。
    • "service nginx force-reload":强制重新加载 Nginx 服务,使 SSL 证书生效。
五、部署SSL证书到雷池WAF

雷池WAF的默认SSL证书目录/data/safeline/resources/nginx/certs,雷池WAF安装SSL证书,要求WAF版本 >= 7.2.0,获取证书后覆盖上述文件即可,WAF定时更新:WAF默认每小时刷新一次证书内容

在这里插入图片描述

可以参考雷池WAF官方给出的说明:如何在雷池 WAF 通过文件更新 SSL 证书

所以部署SSL证书到雷池WAF命令如下:

cp /root/.acme.sh/www.test.com_ecc/fullchain.cer /data/safeline/resources/nginx/certs/cert_1.crt
cp /root/.acme.sh/www.test.com_ecc/www.test.com.key /data/safeline/resources/nginx/certs/cert_1.key
六、使用Linux shell写成全自动执行脚本

经过前面五个步骤,可以成功更新SSL证书了。但是手动执行命令繁琐,经过多次实际测试调试脚本,我们可以使用Linux Shell脚本acme_deploy_ssl.sh实现全自动化申请续签免费SSL证书,并部署在Linux宝塔网站和雷池WAF。

只需要修改前面2个变量WEB_DOMAIN和WEB_ROOT_NAME值

==================================================

#网站申请SSL证书的域名(www.test.com替换成自己实际域名即可
WEB_DOMAIN=“www.test.com”
#网站根目录名称(68.162.x.x替换成自己实际网站根目录名称即可
WEB_ROOT_NAME=“68.162.x.x”

==================================================

acme_deploy_ssl.sh脚本如下:

#功能:acme.h自动申请签发SSL证书,Linux宝塔网站和雷池WAF更新SSL证书的shell脚本
#!/bin/bash#网站申请SSL证书的域名(www.test.com替换成自己实际域名即可)
WEB_DOMAIN="www.test.com"
#网站根目录名称(68.162.x.x替换成自己实际网站根目录名称即可)
WEB_ROOT_NAME="68.162.x.x"#1.存放acme申请签发的SSL证书目录(root账户的家目录是/root),acme默认安装路径/root/.acme.sh/acme.sh
#2.acme申请签发的SSL证书-密钥(KEY)文件,Your cert key is in: /root/.acme.sh/www.test.com_ecc/www.test.com.key
#3.acme申请签发的SSL证书-证书(cer)文件,And the full-chain cert is in: /root/.acme.sh/www.test.com_ecc/fullchain.cer
CERT_DIR="/root/.acme.sh/${WEB_DOMAIN}_ecc"
#Linux宝塔面板的SSL证书目录
BT_SSL_DIR="/www/server/panel/vhost/cert"
#雷池WAF的默认SSL证书目录
WAF_SSL_DIR="/data/safeline/resources/nginx/certs"cd ~current_datetime=$(date "+%Y-%m-%d %H:%M:%S")
echo "$current_datetime acme开始申请签发SSL证书......"#acme申请签发SSL证书
/root/.acme.sh/acme.sh --issue --dns dns_ali -d "$WEB_DOMAIN"sleep 15 #延时15s#判断acme是否申请签发SSL证书成功?
if [ -f "$CERT_DIR/fullchain.cer" ] && [ -f "$CERT_DIR/${WEB_DOMAIN}.key" ]; thencurrent_datetime_1=$(date "+%Y-%m-%d %H:%M:%S")current_datetime_2=${current_datetime_1//:/-}current_datetime_2=${current_datetime_2// /_}echo "$current_datetime_1 acme申请签发SSL证书成功"#Linux宝塔面板安装SSL证书/root/.acme.sh/acme.sh --install-cert -d "$WEB_DOMAIN" \--key-file "$BT_SSL_DIR/$WEB_ROOT_NAME/privkey.pem"  \--fullchain-file "$BT_SSL_DIR/$WEB_ROOT_NAME/fullchain.pem" \--reloadcmd "service nginx force-reload"current_datetime_1=$(date "+%Y-%m-%d %H:%M:%S")echo "$current_datetime_1 Linux宝塔网站更新SSL证书成功"sleep 10 #延时10s#雷池WAF安装SSL证书,要求WAF版本 >= 7.2.0,获取证书后覆盖上述文件即可,WAF默认每小时刷新一次证书内容cp "$CERT_DIR/fullchain.cer" "$WAF_SSL_DIR/cert_1.crt"cp "$CERT_DIR/${WEB_DOMAIN}.key" "$WAF_SSL_DIR/cert_1.key"current_datetime_1=$(date "+%Y-%m-%d %H:%M:%S")echo "$current_datetime_1 雷池WAF更新SSL证书成功"#备份,重命名acme申请签发的SSL证书文件mv "$CERT_DIR/fullchain.cer" "$CERT_DIR/${current_datetime_2}_fullchain.pem"mv "$CERT_DIR/${WEB_DOMAIN}.key" "$CERT_DIR/${current_datetime_2}_${WEB_DOMAIN}.key"
elsecurrent_datetime=$(date "+%Y-%m-%d %H:%M:%S")echo "$current_datetime acme申请签发SSL证书失败"
fisleep 30 #30s后关闭脚本
exit 0
七、Linux Shell脚本acme_deploy_ssl.sh上传到云服务器测试

1.使用FileZilla远程上传工具,把Linux Shell脚本acme_deploy_ssl.sh上传到云服务器的家目录~下:/root,使用命令ls -l查看下/root目录下文件及权限。

在这里插入图片描述
使用下面命令给acme_deploy_ssl.sh文件添加执行权限

chmod +x acme_deploy_ssl.sh

chmod 755 acme_deploy_ssl.sh

再次使用命令ls -l查看下acme_deploy_ssl.sh文件已有执行权限。

3.使用下面命令运行acme_deploy_ssl.sh

./acme_deploy_ssl.sh

在这里插入图片描述

在这里插入图片描述
可以看到acme.h申请签发SSL证书,并把SSL证书部署到Linux宝塔面板和雷池WAF的运行过程。

4.登陆Linux宝塔面板,查看SSL证书到期时间,已成功续签SSL证书

在这里插入图片描述
5.登陆雷池WAF,查看SSL证书到期时间,已成功续签SSL证书
在这里插入图片描述

八、添加crontab定时任务实现无人自动部署

如果我们使用 curl https://get.acme.sh | sh 方式安装,默认续期任务会自动在定时任务中配置。一定要注释掉acme.h默认续期任务,添加自己的续期任务。

#设置每月执行一次的续期定时任务(每月第一天)
0 0 1 * * /root/acme_deploy_ssl.sh &>> /root/.acme.sh/acme_ssl.log

关于crontab定时任务知识可以参考文章:

Linux系统通过编辑crontab来设置定时任务—定时关机


http://www.xdnf.cn/news/671797.html

相关文章:

  • 基于递归思想的系统架构图自动化生成实践
  • VMware-MySQL主从
  • AI提示工程(Prompt Engineering)高级技巧详解
  • 【大模型实战篇】BGE-Rerank-base重排服务部署教程
  • AI前端开发岗位面试准备指南
  • 什么是数据驱动?以及我们应如何理解数据驱动?
  • 什么是可重组机器人?
  • 33. 自动化测试开发之使用mysql异步连接池实现mysql数据库操作
  • 前端域名、端口、协议一样,本地缓存可以共享吗?
  • 【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 - 2信息采集
  • Protocol Buffers 复杂嵌套编译指南:生成 C++ 代码
  • JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面
  • 开源酷炫大数据可视化大屏html+eacher 100+套
  • 力扣热题——分类求和并作差
  • Vue-02 (使用不同的 Vue CLI 插件)
  • 从 PyTorch 到 TensorFlow Lite:模型训练与推理
  • 【华为云物联网】iOtDA数据以表格字段转发OBS的设置攻略,便于以后数据上大屏
  • 如何描述BUG
  • VUE项目部署IIS服务器手册
  • 机器学习笔记【Week6】
  • 打板策略实战对比,khQuant回测横评第三弹【AI量化第29篇】
  • Nginx 在四大核心场景中的应用实践与优化
  • 深入解析 Flink 中的时间与窗口机制
  • 安卓证书的申请(保姆级图文)
  • Python服务器请求转发服务
  • KT6368A通过蓝牙芯片获取手机时间详细说明,对应串口指令举例
  • ubuntu中,c和c+程序,预编译、编译、链接和运行命令
  • 交换机 路由器
  • 2025 年江西研究生数学建模竞赛题A题电动汽车充电桩共享优化与电网安全协同模型完整思路 模型代码 结果 成品分享
  • 模板应用更新同步到所有开发中的应用