package main import ( "crypto/x509" "encoding/pem" "fmt" "io/ioutil" "html/template" "os" "sort" ) func handleErr(err error, str string, a ...interface{}) { a = append([]interface{}{err}, a...) if err != nil { fmt.Fprintf(os.Stderr, str, a...) os.Exit(1) } } func readTLS(filename string) (map[string]*x509.Certificate, error) { file, err := os.Open(filename) if err != nil { return nil, err } data, err := ioutil.ReadAll(file) if err != nil { return nil, err } ret := make(map[string]*x509.Certificate) for len(data) > 0 { var certPem *pem.Block certPem, data = pem.Decode(data) certX509, err := x509.ParseCertificate(certPem.Bytes) if err != nil { return nil, err } ret[certX509.Subject.CommonName] = certX509 } return ret, nil } func readCrtSh(filename string, hosts []string) (map[string]*x509.Certificate, error) { file, err := os.Open(filename) if err != nil { return nil, err } data, err := ioutil.ReadAll(file) if err != nil { return nil, err } ret := make(map[string]*x509.Certificate) for len(data) > 0 { var certPem *pem.Block certPem, data = pem.Decode(data) certX509, err := x509.ParseCertificate(certPem.Bytes) if err != nil { return nil, err } for _, host := range hosts { if certX509.VerifyHostname(host) == nil { if old, haveold := ret[host]; !haveold || certX509.NotBefore.After(old.NotBefore) { ret[host] = certX509 } } } } return ret, nil } func keys(m map[string]*x509.Certificate) []string { ret := make([]string, len(m)) i := 0 for k := range m { ret[i] = k i++ } sort.Strings(ret) return ret } func fmtCert(cert *x509.Certificate) string { return fmt.Sprintf("%s\t%s\t%s", cert.Subject.CommonName, cert.NotBefore.Format("2006-01-02 15:04:05 MST(-07)"), cert.NotAfter.Format("2006-01-02 15:04:05 MST(-07)")) } var tmpl = template.Must(template.New("2html"). Funcs(template.FuncMap{ "class": class, "link": link, "join": join, "isNil": isNil, }).Parse(`
--- {{.fileTLS}} | |||
+++ {{.fileCrtSh}} | |||
@@ -1,{{len .certsTLS}} +1,{{len .certsCrtSh}} @@ | |||
{{.pfix}} | {{.cert.Subject.CommonName}} | {{.cert.NotBefore.Local.Format "2006-01-02 15:04:05"}} | {{.cert.NotAfter.Local.Format "2006-01-02 15:04:05"}} |