一、背景
公司使用的域名大多是周期一年的免费证书,而且不是由阿里云等云平台进行颁发的,没有到期提醒。
二、脚本
#!/bin/bash
# 功能:检测证书过期天数
# yousong.xiang
# 2021.8.25
# v1.0.1
# 域名存储文件domain_ssl.info,同时脚本所在的服务器需要安装openssl,同时要保证域名及端口能通
[ -f /etc/profile ] && . /etc/profile
script_dir=`cd "( dirname "0" )" && pwd`
domain_file="domain_ssl.info"
check_log={script_dir}/check_domain.log
dingtalk="https://oapi.dingtalk.com/robot/send?access_token=90fea408c219b11aa93ae518ad38460074077737992144dcfb86b65f08093b96"
if [ ! -f{script_dir}/{domain_file} ]; then
touch{script_dir}/{domain_file}
fi
egrep -v "^#|^" {script_dir}/{domain_file} |while read line
do
get_domain=`echo "{line}" | awk -F ':' '{print1}'`
get_port=`echo "{line}" | awk -F ':' '{print2}'`
END_TIME=`echo | openssl s_client -servername {get_domain} -connect{get_domain}:{get_port} 2>/dev/null | openssl x509 -noout -dates |grep 'After'| awk -F '=' '{print2}'| awk -F ' +' '{print 1,2,4 }'`
t_time=`date '+%Y-%m-%d %H:%M:%S'`
if [? -ne 0 ] || [ -z "{END_TIME}" ]; then
echo "{t_time} {get_domain}证书检测失败!" >>{check_log}
else
echo "{t_time}{get_domain}证书检测中..." >> {check_log}
fi
sleep 1;
END_TIME1=`date +%s -d "END_TIME"`
#将目前的日期也转化为时间戳
NOW_TIME=`date +%s -d "(date | awk -F ' +' '{print2,3,6}')"`
#到期时间减去目前时间再转化为天数
RST=((((END_TIME1-NOW_TIME))/(60*60*24)))
t_time=`date '+%Y-%m-%d %H:%M:%S'`
echo "{t_time}{get_domain}有效期:{RST}" >>{check_log}
# 如果小于10天则进行告警推送
if [ RST -lt 10 ]; then
echo "证书{get_domain}有效期小于10天!"
curl {dingtalk} \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "warning 证书'{get_domain}'有效期小于10天或端口证书检测异常!"
}
}'
else
echo "证书${get_domain}有效期大于等于10天"
fi
done
三、注意事项
- domain_ssl.info文件中需要写好域名及端口。例如:blog.g6p.cn:443
- domain_ssl.info文件和脚本必须放同一级目录下
- dingtalk为钉钉机器人的url,通知关键字含”warning”、”证书”均可
四、写在最好
- crontab命令:16 16 * * * 1-5 cd /data/scripts; bash /data/scripts/domain_check.sh &>/tmp/b.txt
- 没怎么花时间弄出来的脚本将就着用吧
留言