From 823d1ba1abb8cae3378a19951ebd6a5ad0329fd6 Mon Sep 17 00:00:00 2001 From: lupinthe14th Date: Wed, 3 Jul 2019 14:07:04 +0900 Subject: [PATCH 1/5] :sparkles: New feature: supprt starttls --- main.go | 42 ++++++++++++++++++++++++++++++++++++++---- main_test.go | 1 + 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index f0566c5..9e59901 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "crypto/tls" "fmt" + "net/smtp" "os" "time" @@ -13,16 +14,49 @@ 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 + } + 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) 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 { From 002b87136592707346a715e5faa6b83e0551a0c4 Mon Sep 17 00:00:00 2001 From: lupinthe14th Date: Wed, 3 Jul 2019 17:42:11 +0900 Subject: [PATCH 2/5] :books: add badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fe520cb..af6786c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # cTLS Check TLS Certificates expire + +[![Build Status](https://travis-ci.org/lupinthe14th/cTLS.svg?branch=master)](https://travis-ci.org/lupinthe14th/cTLS) From e7bfe350d36dfd4cbf0372d8cb2a1189a3c15ca5 Mon Sep 17 00:00:00 2001 From: lupinthe14th Date: Wed, 3 Jul 2019 18:19:27 +0900 Subject: [PATCH 3/5] :books: add coverage badge --- .travis.yml | 13 ++++++++++++- README.md | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) 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 af6786c..013ca9e 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,4 @@ 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) From b4a3509c3088b70513bcb75bfbbd4e70fdbda08d Mon Sep 17 00:00:00 2001 From: lupinthe14th Date: Wed, 3 Jul 2019 21:22:07 +0900 Subject: [PATCH 4/5] :sparkles: New feature: Address list supported --- main.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 9e59901..7e6598e 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,7 @@ func startTLSConnectionState(host, port string) (state tls.ConnectionState, err log.Errorf("smtp: dial: %s", err) return state, err } + defer conn.Close() conn.StartTLS(&tls.Config{ServerName: host}) state, _ = conn.TLSConnectionState() return state, nil @@ -69,10 +70,21 @@ 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"}, + } + + for _, addr := range addrs { + expireTime, err := statePeerCertificateExpireDate(addr.host, addr.port) + if err != nil { + log.Panicln(err) + } + expireJSTTime := expireTime.In(time.FixedZone("Asia/Tokyo", 9*60*60)) + fmt.Println("Peer Certificates: expire time: ", expireJSTTime) } - expireJSTTime := expireTime.In(time.FixedZone("Asia/Tokyo", 9*60*60)) - fmt.Println("Peer Certificates: expire time: ", expireJSTTime) } From 056582d72515748fb3331e059925e8aa8b8b42b1 Mon Sep 17 00:00:00 2001 From: lupinthe14th Date: Wed, 3 Jul 2019 22:23:47 +0900 Subject: [PATCH 5/5] :sparkles: New feature: supprt concurrency --- main.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/main.go b/main.go index 7e6598e..4b8dcb3 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "fmt" "net/smtp" "os" + "sync" "time" log "github.com/sirupsen/logrus" @@ -79,12 +80,18 @@ func main() { {host: "smtp.gmail.com", port: "587"}, } - for _, addr := range addrs { - expireTime, err := statePeerCertificateExpireDate(addr.host, addr.port) - if err != nil { - log.Panicln(err) - } - expireJSTTime := expireTime.In(time.FixedZone("Asia/Tokyo", 9*60*60)) - fmt.Println("Peer Certificates: expire time: ", expireJSTTime) + 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) } + wg.Wait() }