diff --git a/.travis.yml b/.travis.yml index aba7514..c707daa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,12 +3,23 @@ language: go go: - 1.12.x - master + - tip os: - linux - osx dist: trusty sudo: false +before_install: + - go get golang.org/x/tools/cmd/cover + - go get github.com/mattn/goveralls install: true script: - env GO111MODULE=on go build - - env GO111MODULE=on go test + - env GO111MODULE=on go test -v -covermode=count -coverprofile=coverage.out + - $HOME/gopath/bin/goveralls + -coverprofile=coverage.out + -service=travis-ci + -repotoken $COVERALLS_TOKEN +env: + global: + secure: "R+IoGNSttX4tTkDPha5gQOo+Hn3TfjzkWMXfGdu6r1XPYD5Fs8o+aw7rGiNYMVa40oxP54ilW7nlmQUNx/vJytVZWlyWWRfeadNi8VVdpET2BqaOR7U2u/dCHIUZz6FdbXAPMV4XS5blaHYKcQ5zltLb2AbRURFymNkjRlzsLTm8vikjxGPQBYG4LHOE0/piEWgrYHkIMxLlzXAwwnq0A7MeJ8X7qRDdXKIYWYPKhB/s/20h6XkJKELV6shZG21Jgk4dLySrvFSzogtVENWxy575n4N4dIylGBlfdmMqZAqZeiFdnIXYwKk1IoZtR4k1hYsgy2yky1nKGlDobZ+Ihmu553cB5tZo+GhBKzrelBkbxjcvV/P+e1tJK5snQeRNJVQdy2zPvGAHPJQetR+NhGvhb26qqyWZuKtVOv9G09Nh3dVNPIAkobruEpIE0f5wmt1Wt4B3TEqN+FhydQoEhCACacx8Q9B6/m2PVmHfT6SBUsMU/MD++Ztv+CGQEIkHwEIcAneZhoFuP7ZBGwmqlu1Us0HZ9x5GwDMxlLQaVfQJSHtUKL+A5MHXU+kVnOF/KzEsH/jpk+SJoUHUGRngmTi/Im39DcJznV0eNeHVGsBuoY4L+2sLXdqkd+i9w9BzVfY4SDXnechvWtjHIVs51DXJXumXTv3EAzgE0KE6I7Q=" diff --git a/README.md b/README.md index fe520cb..013ca9e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # cTLS Check TLS Certificates expire + +[![Build Status](https://travis-ci.org/lupinthe14th/cTLS.svg?branch=master)](https://travis-ci.org/lupinthe14th/cTLS) +[![Coverage Status](https://coveralls.io/repos/github/lupinthe14th/cTLS/badge.svg?branch=master)](https://coveralls.io/github/lupinthe14th/cTLS?branch=master) diff --git a/main.go b/main.go index f0566c5..4b8dcb3 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,9 @@ package main import ( "crypto/tls" "fmt" + "net/smtp" "os" + "sync" "time" log "github.com/sirupsen/logrus" @@ -13,16 +15,50 @@ func init() { os.Setenv("GODEBUG", os.Getenv("GODEBUG")+",tls13=1") } -func statePeerCertificateExpireDate(host, port string) (expireTime time.Time, err error) { +func startTLSConnectionState(host, port string) (state tls.ConnectionState, err error) { + conn, err := smtp.Dial(fmt.Sprint(host, ":", port)) + if err != nil { + log.Errorf("smtp: dial: %s", err) + return state, err + } + defer conn.Close() + conn.StartTLS(&tls.Config{ServerName: host}) + state, _ = conn.TLSConnectionState() + return state, nil +} + +func tlsConnectionState(host, port string) (state tls.ConnectionState, err error) { conn, err := tls.Dial("tcp", fmt.Sprint(host, ":", port), &tls.Config{}) if err != nil { - log.Errorf("client: dial: %s", err) - return expireTime, err + log.Errorf("tls: dial: %s", err) + return state, err } defer conn.Close() log.Debugln("client: connected to: ", conn.RemoteAddr()) - state := conn.ConnectionState() + state = conn.ConnectionState() + return state, nil +} + +func statePeerCertificateExpireDate(host, port string) (expireTime time.Time, err error) { + var state tls.ConnectionState + switch port { + case "587": + log.Debugf("case: %v", port) + state, err = startTLSConnectionState(host, port) + if err != nil { + log.Errorf("startTLS connection state: %s", err) + } + log.Debugf("startTLS connection state: %v", state) + default: + log.Debugf("case: %v", port) + state, err = tlsConnectionState(host, port) + if err != nil { + log.Errorf("TLS connection state: %s", err) + } + log.Debugf("TLS connection state: %v", state) + } + for _, v := range state.PeerCertificates { if !v.IsCA { log.Println(v.Subject) @@ -35,10 +71,27 @@ func statePeerCertificateExpireDate(host, port string) (expireTime time.Time, er } func main() { - expireTime, err := statePeerCertificateExpireDate("www.google.com", "443") - if err != nil { - log.Panicln(err) + type addr struct { + host string + port string + } + var addrs = []addr{ + {host: "www.google.com", port: "443"}, + {host: "smtp.gmail.com", port: "587"}, + } + + var wg sync.WaitGroup + for i, a := range addrs { + wg.Add(1) + go func(i int, a addr) { + defer wg.Done() + expireTime, err := statePeerCertificateExpireDate(a.host, a.port) + if err != nil { + log.Panicln(err) + } + expireJSTTime := expireTime.In(time.FixedZone("Asia/Tokyo", 9*60*60)) + fmt.Println(i, ": Peer Certificates: expire time:", expireJSTTime) + }(i, a) } - expireJSTTime := expireTime.In(time.FixedZone("Asia/Tokyo", 9*60*60)) - fmt.Println("Peer Certificates: expire time: ", expireJSTTime) + wg.Wait() } diff --git a/main_test.go b/main_test.go index 972c7ec..670e4b0 100644 --- a/main_test.go +++ b/main_test.go @@ -11,6 +11,7 @@ func TestStatePeerCertificateExpireDate(t *testing.T) { port string }{ {host: "www.google.com", port: "443"}, + {host: "smtp.gmail.com", port: "587"}, } for _, tt := range tests {