⬆ ⬆ ⬆ ⬆

资源失效修复

当前位置:首页>站长资源> 宝塔面板配置Let’s Encrypt证书自动续签失效及解决方案
随机语录:
宝塔面板配置Let’s Encrypt证书自动续签失效及解决方案
177°
  • 发布时间
  • 最后更新于
    2022-03-17 16:47:32
  • 文章分类
  • 下载量
    0次【1月内】
  • 下载要求
    暂未获取
  • 文章来源
当前位置:首页>站长资源> 宝塔面板配置Let’s Encrypt证书自动续签失效及解决方案

宝塔面板配置Let’s Encrypt证书自动续签失效及解决方案

释放双眼,带上耳机,听听看~!
宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

一、背景小故事

笔者手里有个朋友交给我去日常运维项目是PHP+微信小程序,部署在Linux系统上。

这个项目是用宝塔面板去进行日常的可视化运维管理,N \ X用起来蛮香的。

如不清楚宝塔的同学,可Z F O M –以自行了解,这里就不详细说明。

宝塔是一款= O P L s简单好用的服务器运维面板,并且永久免费。

我们都知道, 小? x . a )w x F ? I 8 ~ % `程序请求的后端接口,要求5 G D f d :是https协议的。所以后端服务器得配置上SSL证书。

我接手之前,这个项目的SSr + 8 % EL证书是{ U X h直接购买的,而I zd D H G M j 4 0 3 k且也要K G 2 Y l到期了。当时,我对宝塔面板也是第一次接触,不是特熟悉。经过一番摸索,看到宝塔面c 7 T p y 7 e 7 f板提供) G 1 ~9 q # A ~ – a `Let’t j =s Encrypt这样免费的证书4 – Q 2 Y x a。这个证书有个缺点就是只有3个月的免费期限,n X \ {到期后需要再去续期。3 M ( l U ! t | r

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

经过一X F I番折腾,就给网站安排上了这个免费的证P f d书。而且宝塔面板在这里也有明确提示:将在距离到期时间一个月内尝试自动续签q ^ H

看到那个提示后,发现这个证书可以一直免费使用,那倒是省钱又省心了。3 – R

隔了3个月后,老板发来一条消息说:; N G , p _ P }C H n站不正常了,给我看看呗

经过} E n r , *我一顿熟悉操作分析,排查服务器,排查应用,并利用fiddler抓包工具去进行抓包分析后,确定是Https协议到期导致的问题。

j 1 Y z后我在SSL配2 E x 8 6置界面上Y 3 U h2 ; ? q x E u,手动去点续签,等了一会儿,续签成功。网站又可以正常访问,告诉老板完美解决。

又经过一段时间后,老板又发来一条消息说,网站又不正常,再给我看看什么问题。

我一看到消息,知{ E ) r & W ,道又翻车了。不过这次我是轻车熟路,直接去手动点了一下续签,解决。

……

就这样,重复了很多次。

这样长久下去,j – B也不是办法。

二、萌动想法

我得想出g _ :一个法子来解T V O } 1 O # h I决这个问题。毕竟我们都是一枚程序员,专门去解决生活中出现的重复劳动力。

既然点一下续签,就可以解决证书到期问题。那我们S 2 X能不X z = 0 5 I ; %能在程序里用定时任务+模拟请求来自动续签?

我就开始构想一下实现思路:

第一步:我们需要拿到续签按钮触发的后端服务接口及请求参数,后续能模拟请求。

第二步:验证接口是否可以直接请求成功,是否需要权限验证?经过验证,需要先登陆,才能请求成功。

k r ( : s #三步:还需要一个定时任务功能。经过确认 宝塔面板自带有任– 7 q Z l务计划功能。

带着这样的想法,开始去尝试实现,过% w { U程中有{ a h *遇到很多问题,就不详细说明,主要都是在写Shell脚本构造请求参数传递。

我就直接上解决方案供同学们参考。

三、方案实践5 ~ ] T – (

3.1 找到续签请W v 9 i s v f求接口

接口地址:c O w 0 4 – O Bhtn L 6tp6 e b t , z ]:/g X G ` K Z/IP:8888/ssl?action=Renew2 8 @ [_SSL

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

如果我们直接请求该接口,会发现需要登陆,不能直接请求成功。

3.2 设置宝塔 API接口

经过查? $ | * g5 e U V } m o i阅资料,宝塔面板提供了API接口,用密钥keyL M N生成token后,再发起请求就可以,而不需要用户名和密码。我a l – = P ! = o们能方便直接使用宝塔里面的任何API接口。

面板设置 =》打开 API接口,r : T / & ^ t S拿到密钥key,3 i 2 Z 3 E d $并配置IP白名单。IP可以直接添加服务器IP。

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

而且宝塔也k \ V提供了多个版本的API接口 Demo样例,可以很方便的集成。
样例地址:https://www.bt.cn/bbs/thread-20376-1-1.html

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

我比较熟悉Java,也就下载的JavaDemo研究的。

package com.raysonfang.bt.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;

/**
 * 宝塔API测试
 *
 * @author fanglei
 * @date 2021/02/21 10:44
 **/
public class BTTest {
    public static void main(String[] args)
    {
        try {
            String btSign = "宝塔API密钥";
            String url = "http://IP:8888/ssl?action=Renew_SSL";
            String timestamp = System.currentTimeMillis() + "";
            String md5Sign = getMd5(btSign);
            String temp = timestamp+md5Sign;
            String token = getMd5(temp);
            String json = "request_time="+timestamp+"&request_token="+token;
            String responseText = sendPost(url,json);
            System.out.println(responseText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static String getMd5(String str) throws Exception
    {
        try {
            // 生成一个MD5加密计算摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 计算md5函数
            md.update(str.getBytes());
            // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
            return new BigInteger(1, md.digest()).toString(16);
        } catch (Exception e) {
            throw new Exception("MD5加密出现错误,"+e.toString());
        }
    }
    
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuffer result = new StringBuffer();
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "text/xml,text/javascript,text/html,application/json");
            conn.setRequestProperty("connection", "Keep-Alive");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result.toString();
    }
}

下载demo 研究请求参数构成,并调试成功。

3.3 设置定时任务,模拟请求

宝塔 直接提供有计划任务功能,我们先看看能不能实T ` ` q D |现我们想要的功能,如果不能,我们再想其他办N y x v z – X *法解决。

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

我看了任务类型有:Shell脚本, 备份网站,备份数据W S V l库,日志切割,释放内存,访问URL。

其中 Shell脚本访问URL2 l V两种任务类型跟我们想要的很接近,其他的都不怎么适合。

访问URL这种类型也可以排除,是因为这里采用直接配置U– U ARL,适R + W q d合无动态} 3 h g 6 |参数U – l Y D B f,无权限验证的URL。

那剩下的就只有Shell脚本来实现。

我们知道SheF + ill脚本也是一种! S ^ F编程语言A u z # G n l N –脚本,那我们就用它来模拟请求了。

经过8 8 5 2 6几个小时N ] 3的研究,把shell脚本e k l q ! B @写出来。还是很费劲,对于Shell脚本里的参数传递语法不怎么熟悉,也反复去尝试,才摸索清楚。

#!/bin/bash

# 获取时间戳
cur_timestamp=$((`date '+%s'`*1000+`date '+%N'`/1000000))
# 宝塔密钥
api_sk='uSth3rmADQ9Np5Zyhxxxxxxxxxxxxxxx'
# 密钥MD5加密
key=`echo -n $api_sk|md5sum|cut -d" " -f1`
# 生成token
request_token=`echo -n $cur_timestamp$key|md5sum|cut -d" " -f1`
# 构造请求参数,并通过curl发送请求
curl -i -X POST -d "request_token=$request_token&request_time=$cur_timestamp" http://ip:8888/ssl?action=Renew_SSL

3 1 W ( Y J Q q JShell脚本的密钥和IP进行替换,就可以直接去任务计划添加上,然后手动执行一下看看 是否可以运行成~ O k !

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

注意:第一次添加任务后,w # 3 1 z u # ( c需要手动点执行,并在日志去查看D X B B v 5 : b是否执行成功

宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

至此,以后2 \ 6Z A # g . O k u可以z R ? rH W x _ / \ K _ u Z放心交给程序自动续签。

四、总结

也许官方已经解决了自动续签的问题,而我这个也许是个偏方,但这里面包含抓包,定时任务,接E o K } @ H口鉴权,Shell脚本等知识运用

温馨提示
本站网络名称: 墨梅博客
本文章永久网址: https://momeis.net/post-7028.html
网站侵权说明: 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长Email:momeis6@qq.com 删除处理。
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们第一时间更新。

给TA打赏
共{{data.count}}人
人已打赏

相关文章

站长资源

抖音下载助手GUI版 主页视频批量下载

2021-2-11 12:30:02

站长资源

一款无线PIN码计算器

2021-3-18 11:44:56

免责声明

本站资源大多来自网络,如有侵犯你的权益请联系管理员,邮箱momeis6@qq.com 根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。 本站为个人博客非盈利性站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。本站部份代码及教程来源于互联网,仅供网友学习交流,若您喜欢本文可附上原文链接随意转载。


如果遇到付费才可观看的文章,建议升级终身VIP。全站所有资源任意下免费看”。本站资源大部分采用7z压缩,为防止有人压缩软件不支持7z格式,7z解压,建议下载7-zip,zip、rar解压,建议下载WinRAR

0 条回复 A文章作者 M管理员
表情包
  • AC娘
  • Tv小电视
  • 婲喵酱
  • 大黄脸
  • 一人之下
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
  • 3013 用户总数(个)
  • 1561 文章总数(篇)
  • 浏览总数(PV)
  • 今日发布(篇)
  • 1724 运行天数(天)
立即加入

  • 波浪
  • 波浪
  • 波浪
  • 波浪