一、背景

公司使用的域名大多是周期一年的免费证书,而且不是由阿里云等云平台进行颁发的,没有到期提醒。

二、脚本

#!/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
  • 没怎么花时间弄出来的脚本将就着用吧
最后修改日期: 2023年12月12日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。