公司证书过期时间扫描(golang)


公司证书过期时间扫描(golang)

// 将公司所有A记录域名解析导出

// 将域名拼接为https://+域名

//设置超时时间,并发扫描域名

//无响应,不正确域名直接抛弃

//打印所有有结果域名过期信息

package main

import (
    "bufio"
    "context"
    "fmt"
    "io"
    "log"
    "net/http"
    "os"
    "strings"
    "sync"
    "time"
)

type Cert struct {
    Name string //域名
    Starttime string //证书签发时间
    Stoptime string //证书过期时间
    IsCA bool  //是不是根证书
}

var  d  =  make(map[string]*Cert)
var w sync.WaitGroup


func main()  {
    //设置ctx,主要用来设置超时时间
    ctx := context.Context(context.Background())

    //读取文件
    //文件内容参考如下:
    //award.xxx.cn
    //award.yyy.com
    file, err := os.Open(`G:\xrp\smalltools\CheckCert\domain.txt`)
    if err !=nil{
        fmt.Println(err)
    }
    defer file.Close()

    reader := bufio.NewReader(file)
    for {
        line, _, err := reader.ReadLine()
        if err != nil {
            if err == io.EOF { //文件已经结束
                break
            }
            fmt.Println("err = ", err)
        }
        //上传httpsurl
        url := "https://"+string(line)
        w.Add(1)
        go GetCert(ctx,string(line),url,&w)
    }

    w.Wait()

    //将所有域名信息的证书打印出来,当然也可以写到文件中
    //这里打印逗号,是方便csv文件转换
    for _,v := range d{
        fmt.Println(v.Name,",",v.Stoptime,",",v.IsCA)
    }

}

func GetCert(ctx context.Context,urlreal,url string,w *sync.WaitGroup)  {
    //证书
    var cc Cert
    //wg减一
    defer w.Done()

    //设置过期时间,避免出错域名,无反应
    ctx, cancel:= context.WithTimeout(context.Background(), time.Second*5)
    defer cancel()

    client := &http.Client{}
    req, err := http.NewRequest("GET",url,nil)
    if err != nil {
        log.Println(err)
    }

    req = req.WithContext(ctx)
    resp, err := client.Do(req)
    if err != nil {
        //无响应直接返回
        return
    }
    defer resp.Body.Close()

    //将证书信息拷贝下来
    certs := resp.TLS.PeerCertificates
    cc.Name= urlreal
    cc.Stoptime= TimeTrim(certs[0].NotAfter.String())
    cc.IsCA = certs[0].IsCA
    d[urlreal]=&cc

}

//截断日期,删除无用数据
func  TimeTrim(s string) string{
    return strings.Trim(s," +0000 UTC")
}