Skip to content

Instantly share code, notes, and snippets.

@uolter
Created December 27, 2021 12:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uolter/c386975aa23fd5d58a7edb54c5739359 to your computer and use it in GitHub Desktop.
Save uolter/c386975aa23fd5d58a7edb54c5739359 to your computer and use it in GitHub Desktop.
Check TLS (https) certificate
package main
import (
"crypto/tls"
"flag"
"fmt"
"log"
"os"
"time"
)
var (
domain *string
port *int
)
type target struct {
domain string
port int
}
func init() {
domain = flag.String("d", "", "Domain to ckeck.")
port = flag.Int("p", 443, "Http port. Default is 443.")
}
func (t *target) Url() string {
if t.port == 0 {
return fmt.Sprintf("%s:443", t.domain)
}
return fmt.Sprintf("%s:%d", t.domain, t.port)
}
func (t *target) CheckTLS() {
conn, err := tls.Dial("tcp", t.Url(), nil)
if err != nil {
fmt.Println("[ERROR] Server doesn't support SSL certificate err: " + err.Error())
} else {
err = conn.VerifyHostname(t.domain)
if err != nil {
fmt.Println("Hostname doesn't match with certificate: " + err.Error())
}
expiry := conn.ConnectionState().PeerCertificates[0].NotAfter
fmt.Printf("Issuer: %s\nExpiry: %v\n", conn.ConnectionState().PeerCertificates[0].Issuer, expiry.Format(time.RFC850))
currentTime := time.Now()
diff := currentTime.Sub(expiry)
if diff > 0 {
fmt.Println("EXPIRED!!")
}
}
}
func main() {
var t target
// parse flags from command line
flag.Parse()
if *domain == "" {
log.Println("[ERROR] domain can't be empty.")
os.Exit(0)
}
t = target{domain: *domain, port: *port}
t.CheckTLS()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment