You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ro...@apache.org on 2022/02/18 15:41:07 UTC

[trafficcontrol] branch master updated: SSL certificate checks in t3c (#6522)

This is an automated email from the ASF dual-hosted git repository.

rob pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 4940bd1  SSL certificate checks in t3c (#6522)
4940bd1 is described below

commit 4940bd12d7751ed840753c29a842151997e69eff
Author: Joe Pappano <jo...@cable.comcast.com>
AuthorDate: Fri Feb 18 10:40:10 2022 -0500

    SSL certificate checks in t3c (#6522)
    
    * Collect config warnings and print a summary at the end of t3c apply
    
    * fixed formatting errors
    
    * Added warnings to test
    
    * fixed typo
    
    * Updated to capture remap.config issues, and removed check for append that is not needed.
    
    * Added function to verify ssl certificates.
    
    * Updated checkConfigFile verify ssl certificate is valid and log expiration date.
    
    * Added function to insure key and certificate match.
    
    * Removed trailing semicolons on ssl cert message.
    
    * updated function to return error
    
    * added warnings to confgfilewarnings
    
    * keypair check will return an error if there are issues and will store it in warnings to print in the summary.
---
 cache-config/t3c-apply/torequest/cmd.go       | 19 +++++++++++++++++++
 cache-config/t3c-apply/torequest/torequest.go |  9 +++++++++
 cache-config/t3c-generate/cfgfile/sslkeys.go  | 21 +++++++++++++++++++--
 3 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/cache-config/t3c-apply/torequest/cmd.go b/cache-config/t3c-apply/torequest/cmd.go
index 420dd2f..fe9d775 100644
--- a/cache-config/t3c-apply/torequest/cmd.go
+++ b/cache-config/t3c-apply/torequest/cmd.go
@@ -23,7 +23,9 @@ package torequest
 
 import (
 	"bytes"
+	"crypto/x509"
 	"encoding/json"
+	"encoding/pem"
 	"errors"
 	"fmt"
 	"io/ioutil"
@@ -32,6 +34,7 @@ import (
 	"os/exec"
 	"strconv"
 	"strings"
+	"time"
 
 	"github.com/apache/trafficcontrol/cache-config/t3c-apply/config"
 	"github.com/apache/trafficcontrol/cache-config/t3cutil"
@@ -333,6 +336,22 @@ func checkRefs(cfg config.Cfg, cfgFile []byte, filesAdding []string) error {
 	return nil
 }
 
+//checkCert checks the validity of the ssl certificate
+func checkCert(c []byte) error {
+	block, _ := pem.Decode(c)
+	cert, err := x509.ParseCertificate(block.Bytes)
+	if err != nil {
+		return err
+	}
+	if cert.NotAfter.Unix() < time.Now().Unix() {
+		err = errors.New("Certificate expired: " + cert.NotAfter.Format("Jan 2, 2006 15:04 MST"))
+		log.Warnf(err.Error())
+	} else {
+		log.Infof("Certificate valid until %s ", cert.NotAfter.Format("Jan 2, 2006 15:04 MST"))
+	}
+	return err
+}
+
 // checkReload is a helper for the sub-command t3c-check-reload.
 func checkReload(changedConfigFiles []string) (t3cutil.ServiceNeeds, error) {
 	log.Infof("t3c-check-reload calling with changedConfigFiles '%v'\n", changedConfigFiles)
diff --git a/cache-config/t3c-apply/torequest/torequest.go b/cache-config/t3c-apply/torequest/torequest.go
index d52ceb7..4cc3bff 100644
--- a/cache-config/t3c-apply/torequest/torequest.go
+++ b/cache-config/t3c-apply/torequest/torequest.go
@@ -228,6 +228,15 @@ func (r *TrafficOpsReq) checkConfigFile(cfg *ConfigFile, filesAdding []string) e
 		log.Infoln("Successfully verified plugins used by '" + cfg.Name + "'")
 	}
 
+	if strings.HasSuffix(cfg.Name, ".cer") {
+		if err := checkCert(cfg.Body); err != nil {
+			r.configFileWarnings[cfg.Name] = append(r.configFileWarnings[cfg.Name], fmt.Sprintln(err))
+		}
+		for _, wrn := range cfg.Warnings {
+			r.configFileWarnings[cfg.Name] = append(r.configFileWarnings[cfg.Name], wrn)
+		}
+	}
+
 	changeNeeded, err := diff(r.Cfg, cfg.Body, cfg.Path, r.Cfg.ReportOnly, cfg.Perm)
 
 	if err != nil {
diff --git a/cache-config/t3c-generate/cfgfile/sslkeys.go b/cache-config/t3c-generate/cfgfile/sslkeys.go
index b9ed4c9..4f3cb58 100644
--- a/cache-config/t3c-generate/cfgfile/sslkeys.go
+++ b/cache-config/t3c-generate/cfgfile/sslkeys.go
@@ -20,7 +20,9 @@ package cfgfile
  */
 
 import (
+	"crypto/tls"
 	"encoding/base64"
+	"errors"
 
 	"github.com/apache/trafficcontrol/cache-config/t3cutil"
 	"github.com/apache/trafficcontrol/lib/go-atscfg"
@@ -59,6 +61,12 @@ func GetSSLCertsAndKeyFiles(toData *t3cutil.ConfigData) ([]t3cutil.ATSConfigFile
 			key = append(key, '\n') // it's going to be a file, needs a trailing newline to be POSIX-compliant.
 		}
 
+		var keyPairErr []string
+		pairErr := CheckKeyPair(key, cert, string(dsName))
+		if pairErr != nil {
+			keyPairErr = append(keyPairErr, pairErr.Error())
+		}
+
 		certName, keyName := atscfg.GetSSLMultiCertDotConfigCertAndKeyName(dsName, ds)
 
 		keyFile := t3cutil.ATSConfigFile{}
@@ -66,7 +74,7 @@ func GetSSLCertsAndKeyFiles(toData *t3cutil.ConfigData) ([]t3cutil.ATSConfigFile
 		keyFile.Path = "/opt/trafficserver/etc/trafficserver/ssl/" // TODO read config, don't hard code
 		keyFile.Text = string(key)
 		keyFile.Secure = true
-		keyFile.Warnings = dsWarns
+		keyFile.Warnings = keyPairErr
 		configs = append(configs, keyFile)
 
 		certFile := t3cutil.ATSConfigFile{}
@@ -74,9 +82,18 @@ func GetSSLCertsAndKeyFiles(toData *t3cutil.ConfigData) ([]t3cutil.ATSConfigFile
 		certFile.Path = "/opt/trafficserver/etc/trafficserver/ssl/" // TODO read config, don't hard code
 		certFile.Text = string(cert)
 		certFile.Secure = true
-		certFile.Warnings = dsWarns
+		certFile.Warnings = keyPairErr
 		configs = append(configs, certFile)
 	}
 
 	return configs, nil
 }
+
+func CheckKeyPair(keyPem []byte, certPem []byte, ds string) error {
+	_, err := tls.X509KeyPair(certPem, keyPem)
+	if err != nil {
+		log.Warnf("Issue with keypair for %s: %s", ds, err)
+		return errors.New("Issue with keypair for " + ds + ": " + err.Error())
+	}
+	return nil
+}