公司证书过期时间扫描(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")
}