@@ -12,10 +12,12 @@ import (
1212func parsePEM (pemCerts []byte ) (certs []* x509.Certificate , err error ) {
1313 for len (pemCerts ) > 0 {
1414 var block * pem.Block
15+
1516 block , pemCerts = pem .Decode (pemCerts )
1617 if block == nil {
1718 break
1819 }
20+
1921 if block .Type != "CERTIFICATE" || len (block .Headers ) != 0 {
2022 continue
2123 }
@@ -24,14 +26,13 @@ func parsePEM(pemCerts []byte) (certs []*x509.Certificate, err error) {
2426 if err != nil {
2527 return nil , err
2628 }
29+
2730 certs = append (certs , cert )
2831 }
2932 return
3033}
3134
3235func checkRootCertsPEM (t * testing.T , pemCerts []byte , whenFail time.Time , whenWarn time.Time ) (ok bool ) {
33- const warnEmoji = "\u26a0 \ufe0f "
34- // t.Logf("%#v %[1]x %x", warnEmoji, []rune(warnEmoji))
3536 now := time .Now ()
3637 t .Logf ("Checking certificate validity on %s..." , whenFail )
3738 certs , err := parsePEM (pemCerts )
@@ -46,6 +47,7 @@ func checkRootCertsPEM(t *testing.T, pemCerts []byte, whenFail time.Time, whenWa
4647 }
4748
4849 var minExpires time.Time
50+ var minExpiresName string
4951 ok = true
5052 for _ , cert := range certs {
5153 name := cert .Subject .CommonName
@@ -57,42 +59,53 @@ func checkRootCertsPEM(t *testing.T, pemCerts []byte, whenFail time.Time, whenWa
5759 }
5860
5961 if ! cert .IsCA {
60- t .Errorf ("\u274C %s: not a certificate authority" , name )
62+ t .Errorf ("❌ %s: not a certificate authority" , name )
6163 }
64+
6265 const keyUsageExpected = x509 .KeyUsageCertSign | x509 .KeyUsageCRLSign | x509 .KeyUsageDigitalSignature
6366 if (cert .KeyUsage &^ keyUsageExpected ) != 0 {
64- t .Logf (warnEmoji + " %s: unexpected key usage %#x (expecting %#x, see constants at https://pkg.go.dev/crypto/x509#KeyUsage)" , name , cert .KeyUsage , keyUsageExpected )
67+ t .Logf ("⚠️ %s: unexpected key usage %#x (expecting %#x, see constants at https://pkg.go.dev/crypto/x509#KeyUsage)" , name , cert .KeyUsage , keyUsageExpected )
6568 }
69+
6670 if minExpires .IsZero () || cert .NotAfter .Before (minExpires ) {
6771 minExpires = cert .NotAfter
72+ minExpiresName = name
6873 }
74+
6975 // Check that the certificate is valid now
7076 if cert .NotBefore .After (now ) {
71- t .Errorf ("\u274C %s: fails NotBefore check: %s" , name , cert .NotBefore )
77+ t .Errorf ("❌ %s: fails NotBefore check: %s" , name , cert .NotBefore )
7278 continue
7379 }
80+
7481 // ... and that it will still be valid later
7582 if cert .NotAfter .Before (whenFail ) {
76- t .Errorf ("\u274C %s: fails NotAfter check: %s" , name , cert .NotAfter )
83+ t .Errorf ("❌ %s: fails NotAfter check: %s" , name , cert .NotAfter )
7784 continue
78- } else if cert .NotAfter .Before (whenWarn ) {
79- t .Logf (warnEmoji + " %s: fails NotAfter check: %s" , name , cert .NotAfter )
8085 }
86+
87+ if cert .NotAfter .Before (whenWarn ) {
88+ t .Logf ("⚠️ %s: fails NotAfter check: %s" , name , cert .NotAfter )
89+ }
90+
8191 _ , err := cert .Verify (x509.VerifyOptions {
8292 Roots : roots ,
8393 CurrentTime : whenFail ,
8494 })
8595 if err != nil {
86- t .Errorf ("\u274C %s: %s" , name , err )
96+ t .Errorf ("❌ %s: %s" , name , err )
8797 ok = false
88- } else {
89- t .Logf ("\u2705 %s (expires: %s)" , name , cert .NotAfter )
98+ continue
9099 }
100+
101+ t .Logf ("✅ %s (expires: %s)" , name , cert .NotAfter )
91102 }
103+
92104 if ok {
93105 t .Log ("Success." )
94- t .Logf ("MinExpire: %s" , minExpires )
106+ t .Logf ("MinExpire: %s (Certificate: %s) " , minExpires , minExpiresName )
95107 }
108+
96109 return
97110}
98111
@@ -101,5 +114,5 @@ func TestCerts(t *testing.T) {
101114 checkRootCertsPEM (t , []byte (embedded .MozillaCACertificatesPEM ()), time .Now ().AddDate (0 , 1 , 0 ), time .Now ().AddDate (0 , 3 , 0 ))
102115
103116 // Should fail
104- //checkRootCertsPEM(t, []byte(embedded.MozillaCACertificatesPEM()), time.Now().AddDate(20, 0, 0), time.Now().AddDate(30, 0, 0))
117+ // checkRootCertsPEM(t, []byte(embedded.MozillaCACertificatesPEM()), time.Now().AddDate(20, 0, 0), time.Now().AddDate(30, 0, 0))
105118}
0 commit comments