(原創(chuàng))寶塔面板配置Let's Encrypt證書自動續(xù)簽失效及解決方案

一盛正、背景小故事

筆者手里有個朋友交給我去日常運(yùn)維項(xiàng)目是PHP+微信小程序隧熙,部署在Linux系統(tǒng)上灶似。

這個項(xiàng)目是用寶塔面板去進(jìn)行日常的可視化運(yùn)維管理荠卷,用起來蠻香的模庐。

如不清楚寶塔的同學(xué),可以自行了解油宜,這里就不詳細(xì)說明掂碱。

我們都知道, 小程序請求的后端接口慎冤,要求是https協(xié)議的疼燥。所以后端服務(wù)器得配置上SSL證書。

我接手之前蚁堤,這個項(xiàng)目的SSL證書是直接購買的醉者,而且也要到期了。當(dāng)時(shí)披诗,我對寶塔面板是第一次接觸撬即,不是特熟悉。經(jīng)過一段時(shí)間摸索呈队,看到寶塔面板提供Let's Encrypt免費(fèi)的SSL證書剥槐。這個證書有個缺點(diǎn)就是只有3個月的免費(fèi)期限,到期后需要再去續(xù)期宪摧。

image.png

經(jīng)過一番折騰舆声,就給網(wǎng)站安排上了這個免費(fèi)的證書聪富。而且寶塔面板在這里也有明確提示:將在距離到期時(shí)間一個月內(nèi)嘗試自動續(xù)簽

看到那個提示后悲敷,發(fā)現(xiàn)這個證書可以一直免費(fèi)使用柿赊,那倒是省錢又省心了闷游。

隔了3個月后瞻鹏,老板發(fā)來一條消息說:網(wǎng)站不正常了朦佩,給我看看唄

經(jīng)過我一頓熟悉操作分析膝蜈,排查服務(wù)器锅移,排查應(yīng)用熔掺,并利用fiddler抓包工具去進(jìn)行抓包分析后饱搏,確定是Https協(xié)議到期導(dǎo)致的問題。

然后我在SSL配置界面上置逻,手動去點(diǎn)了一下續(xù)簽推沸,等了一會兒,續(xù)簽成功,網(wǎng)站又可以正常訪問鬓催,告訴老板完美解決肺素。

又經(jīng)過一段時(shí)間后,老板又發(fā)來一條消息說宇驾,網(wǎng)站又不正常倍靡,再給我看看什么問題。

我一看到消息课舍,知道又翻車了塌西。不過這次我是輕車熟路,直接去手動點(diǎn)了一下續(xù)簽筝尾,解決捡需。

......

就這樣,重復(fù)了很多次筹淫。

這樣長久下去站辉,也不是辦法。

二损姜、萌動想法

我得想出一個法子來解決這個問題饰剥。畢竟我們都是一枚程序員,專門去解決生活中出現(xiàn)的重復(fù)勞動力摧阅。

既然點(diǎn)一下續(xù)簽捐川,就可以解決證書到期問題。那我們能不能在程序里用定時(shí)任務(wù)+模擬請求來自動續(xù)簽逸尖?

我就開始構(gòu)想一下實(shí)現(xiàn)思路:

第一步:我們需要拿到續(xù)簽按鈕觸發(fā)的后端服務(wù)接口及請求參數(shù)古沥,后續(xù)能模擬請求。

第二步:驗(yàn)證接口是否可以直接請求成功娇跟,是否需要權(quán)限驗(yàn)證岩齿?經(jīng)過驗(yàn)證,需要先登陸苞俘,才能請求成功盹沈。

第三步:還需要一個定時(shí)任務(wù)功能。經(jīng)過確認(rèn) 寶塔面板自帶有任務(wù)計(jì)劃功能吃谣。

帶著這樣的想法乞封,開始去嘗試實(shí)現(xiàn),過程中有遇到很多問題岗憋,就不詳細(xì)說明肃晚,主要都是在寫Shell腳本構(gòu)造請求參數(shù)傳遞。

我就直接上解決方案供同學(xué)們參考仔戈。

三关串、方案實(shí)踐

3.1 找到續(xù)簽請求接口

接口地址:http://IP:8888/ssl?action=Renew_SSL

image.png

如果我們直接請求該接口拧廊,會發(fā)現(xiàn)需要登陸,不能直接請求成功晋修。

3.2 設(shè)置寶塔 API接口

經(jīng)過查閱資料吧碾,寶塔面板提供了API接口,用密鑰key生成token后墓卦,再發(fā)起請求就可以倦春,而不需要用戶名和密碼。我們能方便直接使用寶塔里面的任何API接口落剪。

面板設(shè)置 =》打開 API接口溅漾,拿到密鑰key,并配置IP白名單著榴。IP可以直接添加服務(wù)器IP添履。

第一步API接口打開

第二步拿到密鑰和配置IP白名單

而且寶塔也提供了多個版本的API接口 Demo樣例,可以很方便的集成脑又。
樣例地址:https://www.bt.cn/bbs/thread-20376-1-1.html

image.png

我比較熟悉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加密計(jì)算摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 計(jì)算md5函數(shù)
            md.update(str.getBytes());
            // digest()最后確定返回md5 hash值问麸,返回值為8為字符串往衷。因?yàn)閙d5 hash值是16位的hex值,實(shí)際上就是8位的字符
            // BigInteger函數(shù)則將8位的字符串轉(zhuǎn)換成16位hex值严卖,用字符串來表示席舍;得到字符串形式的hash值
            return new BigInteger(1, md.digest()).toString(16);
        } catch (Exception e) {
            throw new Exception("MD5加密出現(xiàn)錯誤,"+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();
            // 設(shè)置通用的請求屬性
            conn.setRequestProperty("accept", "text/xml,text/javascript,text/html,application/json");
            conn.setRequestProperty("connection", "Keep-Alive");
            // 發(fā)送POST請求必須設(shè)置如下兩行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 獲取URLConnection對象對應(yīng)的輸出流
            out = new PrintWriter(conn.getOutputStream());
            // 發(fā)送請求參數(shù)
            out.print(param);
            // flush輸出流的緩沖
            out.flush();
            // 定義BufferedReader輸入流來讀取URL的響應(yīng)
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            System.out.println("發(fā)送 POST 請求出現(xiàn)異常哮笆!"+e);
            e.printStackTrace();
        }
        //使用finally塊來關(guān)閉輸出流来颤、輸入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result.toString();
    }
}

下載demo 研究請求參數(shù)構(gòu)成,并調(diào)試成功稠肘。

3.3 設(shè)置定時(shí)任務(wù)福铅,模擬請求

寶塔 直接提供有計(jì)劃任務(wù)功能,我們先看看能不能實(shí)現(xiàn)我們想要的功能项阴,如果不能滑黔,我們再想其他辦法解決。

計(jì)劃任務(wù)

我看了任務(wù)類型有:Shell腳本, 備份網(wǎng)站环揽,備份數(shù)據(jù)庫略荡,日志切割,釋放內(nèi)存歉胶,訪問URL汛兜。

其中Shell腳本和訪問URL這兩種任務(wù)類型跟我們想要的很接近,其他的都不怎么適合跨扮。

訪問URL序无,這種類型也可以排除验毡,是因?yàn)檫@里采用直接配置URL衡创,適合無動態(tài)參數(shù)帝嗡,無權(quán)限驗(yàn)證的URL。

那剩下的就只有Shell腳本來實(shí)現(xiàn)璃氢。

我們知道Shell腳本也是一種編程語言腳本哟玷,那我們就用它來模擬請求了。

經(jīng)過幾個小時(shí)的研究一也,把shell腳本寫出來巢寡。還是很費(fèi)勁,對于Shell腳本里的參數(shù)傳遞語法不怎么熟悉椰苟,也反復(fù)去嘗試抑月,才摸索清楚。

#!/bin/bash

# 獲取時(shí)間戳
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`
# 構(gòu)造請求參數(shù)舆蝴,并通過curl發(fā)送請求
curl -i -X POST -d "request_token=$request_token&request_time=$cur_timestamp" http://ip:8888/ssl?action=Renew_SSL

把Shell腳本的密鑰和IP進(jìn)行替換谦絮,就可以直接去任務(wù)計(jì)劃添加上,然后手動執(zhí)行一下看看 是否可以運(yùn)行成功

注意:第一次添加任務(wù)后洁仗,需要手動點(diǎn)執(zhí)行层皱,并在日志去查看是否執(zhí)行成功

任務(wù)執(zhí)行成功

至此,以后可以放心交給程序自動續(xù)簽赠潦。

四叫胖、總結(jié)

也許官方已經(jīng)解決了自動續(xù)簽的問題,而我這個也許是個偏方她奥,但是這里面還是包含抓包瓮增,定時(shí)任務(wù),接口鑒權(quán)哩俭,Shell腳本等知識運(yùn)用钉赁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市携茂,隨后出現(xiàn)的幾起案子你踩,更是在濱河造成了極大的恐慌,老刑警劉巖讳苦,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带膜,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸳谜,警方通過查閱死者的電腦和手機(jī)膝藕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咐扭,“玉大人芭挽,你說我怎么就攤上這事滑废。” “怎么了袜爪?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵蠕趁,是天一觀的道長。 經(jīng)常有香客問我辛馆,道長俺陋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任昙篙,我火速辦了婚禮腊状,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苔可。我一直安慰自己缴挖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布焚辅。 她就那樣靜靜地躺著映屋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪法焰。 梳的紋絲不亂的頭發(fā)上秧荆,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音埃仪,去河邊找鬼乙濒。 笑死,一個胖子當(dāng)著我的面吹牛卵蛉,可吹牛的內(nèi)容都是我干的颁股。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼傻丝,長吁一口氣:“原來是場噩夢啊……” “哼甘有!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葡缰,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤亏掀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泛释,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滤愕,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年怜校,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了间影。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡茄茁,死狀恐怖魂贬,靈堂內(nèi)的尸體忽然破棺而出巩割,到底是詐尸還是另有隱情,我是刑警寧澤付燥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布宣谈,位于F島的核電站,受9級特大地震影響机蔗,放射性物質(zhì)發(fā)生泄漏蒲祈。R本人自食惡果不足惜甘萧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一萝嘁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扬卷,春花似錦牙言、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徒恋,卻和暖如春蚕断,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背入挣。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工亿乳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人径筏。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓葛假,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滋恬。 傳聞我的和親對象是個殘疾皇子聊训,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容