5分钟教你SSL证书自动巡检与过期提醒

简介: 5分钟教你SSL证书自动巡检与过期提醒

引言


最近我的主站编程时光证书过期了,导致用户访问网站时出错,后面续上免费的证书,由于我是使用的免费的证书,所以证书的有效期只有一年。为了避免证书过期导致网站无法访问,我决定写一个小程序来自动检查证书的过期时间,并在证书快过期时通知我及时更换证书。

image.png


自动巡检SSL证书过期时间


我们首先定义了一个checkCertificates函数,该函数的主要任务是读取一个名为domain.txt的文件,该文件中列出了需要检查的域名和对应的IP地址。

func checkCertificates() {
 file, err := os.Open("domain.txt")
 if err != nil {
  panic(err)
 }
 defer file.Close()
 scanner := bufio.NewScanner(file)
 for scanner.Scan() {
  line := scanner.Text()
  parts := strings.Split(line, ":")
  domain := parts[0]
  ipPool := strings.Split(strings.ReplaceAll(parts[1], ",", " "), " ")
  // ipPool [43.138.235.240]
  fmt.Println("ipPool", ipPool)
  for _, ip := range ipPool {
   conn, err := tls.Dial("tcp", ip+":443", &tls.Config{
    ServerName:         domain,
    InsecureSkipVerify: true, // We're only checking expiration, not validity
   })
   if err != nil {
    fmt.Printf("Error! %s\n", ip)
    fmt.Println(domain)
    continue
   }
   defer conn.Close()
   cert := conn.ConnectionState().PeerCertificates[0]
   endDate := cert.NotAfter
   currentTime := time.Now()
   remainingDays := endDate.Sub(currentTime).Hours() / 24
   fmt.Printf("ip: %s\ndomain: %s\n", ip, domain)
   sendEmail("SSL证书过期提醒", fmt.Sprintf("The certificate for domain %s (IP: %s) will expire in less than %f days!", domain, ip, remainingDays))
   if remainingDays < 7 && remainingDays >= 0 {
    fmt.Println("剩余时间小于七天!请及时更换证书!")
    fmt.Printf("ip: %s, %s\n", ip, domain)
   } else if remainingDays < 0 {
    fmt.Println("证书已过期!请及时更换证书!")
   } else {
    fmt.Printf("剩余天数为:%f\n", remainingDays)
   }
  }
 }
 if err := scanner.Err(); err != nil {
  panic(err)
 }
}


邮件通知


当我们知道了证书的剩余有效期后,下一步是通知相关人员。在sendEmail函数中,我们使用了gomail库来发送邮件。


func sendEmail(subject, body string) {
    from := "linwu.hi@gmail.com"
    pass := "xxx"
    to := "linwu.hi@gmail.com"
    m := gomail.NewMessage()
    m.SetHeader("From", from)
    m.SetHeader("To", to)
    m.SetHeader("Subject", subject)
    m.SetBody("text/plain", body)
    d := gomail.NewDialer("smtp.gmail.com", 587, from, pass)
    if err := d.DialAndSend(m); err != nil {
        log.Fatal(err)
    }
}


定时任务


为了确保我们能够及时地检测到证书的状态,我们需要定期执行上述的检查任务。在main函数中,我们使用了cron库来创建一个定时任务。


func main() {
    c := cron.New(cron.WithSeconds())
    c.AddFunc("0 0 0 * * ?", checkCertificates) // 每日凌晨0点执行, 检查证书过期时间,通知到老板
    c.Start()
    select {} // 阻止主goroutine退出
}


完整代码


package main
import (
 "bufio"
 "crypto/tls"
 "fmt"
 gomail "gopkg.in/gomail.v2"
 "log"
 "os"
 "strings"
 "time"
)
func sendEmail(subject, body string) {
 from := "linwu.hi@gmail.com"
 pass := "lbqhjuvomebvwtox"
 to := "linwu.hi@gmail.com"
 m := gomail.NewMessage()
 m.SetHeader("From", from)
 m.SetHeader("To", to)
 m.SetHeader("Subject", subject)
 m.SetBody("text/plain", body)
 d := gomail.NewDialer("smtp.gmail.com", 587, from, pass)
 // Send the email
 if err := d.DialAndSend(m); err != nil {
  log.Fatal(err)
 }
}
func checkCertificates() {
 file, err := os.Open("domain.txt")
 if err != nil {
  panic(err)
 }
 defer file.Close()
 scanner := bufio.NewScanner(file)
 for scanner.Scan() {
  line := scanner.Text()
  parts := strings.Split(line, ":")
  domain := parts[0]
  ipPool := strings.Split(strings.ReplaceAll(parts[1], ",", " "), " ")
  // ipPool [43.138.235.240]
  fmt.Println("ipPool", ipPool)
  for _, ip := range ipPool {
   conn, err := tls.Dial("tcp", ip+":443", &tls.Config{
    ServerName:         domain,
    InsecureSkipVerify: true, // We're only checking expiration, not validity
   })
   if err != nil {
    fmt.Printf("Error! %s\n", ip)
    fmt.Println(domain)
    continue
   }
   defer conn.Close()
   cert := conn.ConnectionState().PeerCertificates[0]
   endDate := cert.NotAfter
   currentTime := time.Now()
   remainingDays := endDate.Sub(currentTime).Hours() / 24
   fmt.Printf("ip: %s\ndomain: %s\n", ip, domain)
   sendEmail("SSL证书过期提醒", fmt.Sprintf("The certificate for domain %s (IP: %s) will expire in less than %f days!", domain, ip, remainingDays))
   if remainingDays < 7 && remainingDays >= 0 {
    fmt.Println("剩余时间小于七天!请及时更换证书!")
    fmt.Printf("ip: %s, %s\n", ip, domain)
   } else if remainingDays < 0 {
    fmt.Println("证书已过期!请及时更换证书!")
   } else {
    fmt.Printf("剩余天数为:%f\n", remainingDays)
   }
  }
 }
 if err := scanner.Err(); err != nil {
  panic(err)
 }
}
func main() {
 c := cron.New(cron.WithSeconds())           // 创建一个新的cron实例
 c.AddFunc("0 0 0 * * ?", checkCertificates) // 每日凌晨0点执行
 c.Start()                                   // 开始执行定时任务
 select {}                                   // 阻止主goroutine退出
}

目录
相关文章
|
10月前
|
Shell 网络安全
SSL 证书过期巡检脚本
SSL 证书过期巡检脚本
|
10月前
|
监控 Linux 网络安全
Domain Admin域名和SSL证书过期监控到期提醒
用于解决,不同业务域名SSL证书,申请自不同的平台,到期后不能及时收到通知,导致线上访问异常,被老板责骂的问题。同时,Domain Admin也是一个轻量级监控方案,占用系统资源较少,安装包仅1.5 MB。基于Python3 + Vue3.js 技术栈实现的域名和SSL证书监测平台。支持证书:单域名证书、多域名证书、通配符证书、IP证书、自签名证书。通知渠道:支持邮件、Webhook、企业微信、钉钉、飞书等通知方式。证书部署: 单一主机部署、多主机部署、动态主机部署。的过期监控,到期提醒。
635 3
Domain Admin域名和SSL证书过期监控到期提醒
解决 SmallPDF 联网验证和试用期过期问题
解决 SmallPDF 联网验证和试用期过期问题
92 0
|
监控 机器人 网络安全
一个脚本实现 SSL 证书到期监控,微信通知,太强了!
一个脚本实现 SSL 证书到期监控,微信通知,太强了!
230 0
一个脚本实现 SSL 证书到期监控,微信通知,太强了!
|
负载均衡 网络安全
阿里云负载均衡ssl证书过期更换后,过一段时间又变回原来过期证书的bug的处理办法
阿里云传统负载均衡证书过期后,在负载均衡的监听页面去更换证书,更换后过一段时间证书会变回原来的证书,导致客户端https无法访问。 目前的解决办法是去负载均衡的证书管理,去删除当前过期证书,然后再去负载均衡监听页面配置证书,才不会出现变回原来的证书的问题。
阿里云负载均衡ssl证书过期更换后,过一段时间又变回原来过期证书的bug的处理办法
|
存储 Kubernetes API
关于k8s 集群中证书期限及续约的一些笔记
嗯,k8s 集群CA 证书突然过期了,所有这里整理相关笔记 博文内容涉及: 如何确认证书是否过期 通过 kubeadm 批量续约证书 Demo 理解不足小伙伴帮忙指正
291 0
阿里云资源包到期通知及添加联系人设置操作指导
资源包为预付费的抵扣包,是指您根据业务量级预估一次性付费购买相应规格的商品资源包。自购买日起,一年内有效,有效期内产生的计费调用量优先使用资源包抵扣额度,超出有效期未抵扣的资源包额度自动失效。资源包过期或额度耗尽时,服务将会自动切换为后付费进行按量计费。为了避免购买的资源包超出有效期,额度自动失效。设置资源包到期通知后,则当资源包快到期时,会通过短信、邮箱或站内信方式向您推送通知。阿里云虽然提供了资源包到期通知设置,但是由于对阿里云控制台的不熟悉,往往不知如果进行开启和关闭以及修改添加联系人。本文简单介绍设置资源包到期通知及修改联系人操作步骤,以供参考。
951 1
阿里云资源包到期通知及添加联系人设置操作指导
阿里云资源包额度预警设置操作指导
资源包为预付费的抵扣包,是指您根据业务量级预估一次性付费购买相应规格的商品资源包。自购买日起,一年内有效,有效期内产生的计费调用量优先使用资源包抵扣额度,超出有效期未抵扣的资源包额度自动失效。资源包过期或额度耗尽时,服务将会自动切换为后付费进行按量计费。为了避免当资源包耗尽时,面临服务不可用风险。设置资源包额度预警后,则当资源包剩余一定额度时,会通过短信、邮箱方式向您推送通知。阿里云虽然提供了资源包额度预警设置,但是由于对阿里云控制台的不熟悉,往往不知如果进行额度预警的调整及设置。本文简单介绍设置资源包额度预警操作步骤,以供参考。
781 0
阿里云资源包额度预警设置操作指导
|
数据建模 网络安全
SSL证书过期怎么办?别慌!SSL应急解决方案及注意事项来了
当浏览器飘红显示网站不安全才发现网站SSL证书已过期,而此时又联系不上之前的SSL供应商,一时不知道该如何是好?特此分享SSL证书过期应急解决方案及SSL过期续费相关注意事项。
|
监控 JavaScript 小程序
监控:实现 SSL 证书到期,微信通知
监控:实现 SSL 证书到期,微信通知
监控:实现 SSL 证书到期,微信通知