自從使用了 docker 作為基礎環境以後,我想着寫一個能夠服務進行統一集中管理的面板,一方面不想使用市面上使用比較廣泛面板 因為我做到他們不行啊啊啊,一方面也算是一種練習吧
簡述#
抬頭看下網站證書,yes!已經更換成泛域名證書啦~
簡單的說下現在已經實現的 滿是 bug 的 功能,證書分發,前文提過我是集中一個面板進行管理,面板中集成一個文件 getcerfile.php
可以直接訪問(當然是有鑒權的啦,證書什麼的不鑒權放公網會涼的),證書選用 Let’s 簽發泛域名證書這樣就不用考慮證書簽發的時候解析到底解析到哪台伺服器上去了 不用造多輪子了,ye
證書檢測#
這一部分主要是受了 Axton 大佬的啟發 詳情看 這篇文章,加上本人比較弱,且目前暫時還不想用上數據庫存數據,所以目前是用文件 + shell 進行證書檢查工作 配合 php 輸出為不那麼難看的頁面 並且嵌入在面板中。
效果圖:
emmmmmmmmm 上傳時發現自建圖床好像出了問題。。考慮自己寫一個? 先咕咕咕為敬
代碼如下:
#!/bin/sh
cat urlfile.list | while read line
do
touch "data/$line"
touch "data/$line.ca"
curl https://$line -v -s -o /dev/null 2>"data/$line.ca"
datee=$(date +'%F %H:%M')
echo "最後檢查: " $datee > "data/$line"
data=$(cat "data/$line.ca" | grep 'subject:')
echo "證書域名: " ${data##* subject: } >> "data/$line"
data=$(cat "data/$line.ca" | grep 'start date:')
data=$(date -d "${data##* start date: }" +'%F %H:%M:%S')
echo "簽發日期: "${data} >> "data/$line"
startdate=$data
data=$(cat "data/$line.ca" | grep 'expire date: ')
data=$(date -d "${data##* expire date: }" +'%F %H:%M:%S')
echo "失效日期: " $data >> "data/$line"
enddate=$data
data=$(cat "data/$line.ca" | grep 'issuer: ')
echo "簽發機構: "${data##* issuer: } >> "data/$line"
data=$(cat "data/$line.ca" | grep 'SSL certificate verify ok.')
echo "證書狀態: "${data##* } >> "data/$line"
startdate=$(date -d "${startdate}" +%s)
enddate=$(date -d "${enddate}" +%s)
datee=$(date -d "${datee}" +%s)
long=$(($enddate-$startdate))
datee=$(($datee-$startdate))
datee=$(($datee*100))
hundred=100
persent=$(($datee/$long))
echo "<div class=\"mdui-progress\"><div class=\"mdui-progress-determinate\" style=\"width: ${persent}%;\"></div></div>" >> "data/$line"
rm "data/$line.ca"
done
展示的代碼如下:
<?php
include_once 'config.php';
if ($_COOKIE["user"] == md5($username.$userpasswd)) {
echo '<div class="mdui-panel" mdui-panel>';
function listDir($dir)
{
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != "..") {
echo '<div class="mdui-panel-item">';
echo '<div class="mdui-panel-item-header">'.'<div class="mdui-panel-item-title">'.$file.'</div>'.'<i class="mdui-panel-item-arrow mdui-icon material-icons">keyboard_arrow_down</i>'.'</div>';
echo '<div class="mdui-panel-item-body">';
$myfile = fopen("$dir/$file", "r") or die("Unable to open file!");
while (!feof($myfile)) {
echo '<p>'.fgets($myfile) . '</p>';
}
echo '</div></div>';
fclose($myfile);
}
}
closedir($dh);
}
} else {
echo $dir . '<br>';
}
}
listDir("./data");
echo '</div>';
} else {
echo 'error';
}
?>
證書分發#
emmmm 上面也看的出來我是用 user 和 passwd md5 一下寫進 cookie 進行驗證的,需要驗證的 域名直接存放在 urlfile.list
文件裡面 (我實在是太菜了)
同理分發證書也利用 cookie 進行身份驗證
<?php
include_once 'config.php';
if ($_COOKIE["user"] == md5($username.$userpasswd)) {
$myfile = fopen($_GET['file'], "r") or die("Unable to open file!");
echo fread($myfile, filesize($_GET['file']));
fclose($myfile);
} else {
header("Location: /index.php");
}
?>
然後直接讀取證書文件進行直接輸出,同時 nginx 那兒對文件目錄進行權限控制,獲取證書使用
curl https://****/getcerfile.php?file=ssl/lvcshu.com/lvcshu.com.key -H 'cookie: user=???' > lvcshu.com.key
獲取,這樣在需要部署證書伺服器上定時執行腳本可以更新證書了,同時 泛域名證書 使用 acme.sh 進行自動續期 emmmmmmmm 差不多這樣如各位大佬發現什麼不妥地方記得及時聯繫我啊 QAQ
Telegram:@johnpoint