k3s/pkg/util/cert.go
bo.jiang 4c1f014d27 Optimize certificate status check
Signed-off-by: bo.jiang <bo.jiang@daocloud.io>
2025-05-08 11:57:29 -07:00

66 lines
1.8 KiB
Go

package util
import (
"crypto/x509"
"time"
certutil "github.com/rancher/dynamiclistener/cert"
)
// cert usage constants
const (
CertUsageCertSign = "CertSign"
CertUsageServerAuth = "ServerAuth"
CertUsageClientAuth = "ClientAuth"
CertUsageUnknown = "Unknown"
)
// cert status constants
const (
CertStatusOK = "OK"
CertStatusWarning = "WARNING"
CertStatusExpired = "EXPIRED"
CertStatusNotYetValid = "NOT YET VALID"
)
// EncodeCertsPEM is a wrapper around the EncodeCertPEM function to return the
// PEM encoding of a cert and chain, instead of just a single cert.
func EncodeCertsPEM(cert *x509.Certificate, caCerts []*x509.Certificate) []byte {
pemBytes := certutil.EncodeCertPEM(cert)
for _, caCert := range caCerts {
pemBytes = append(pemBytes, certutil.EncodeCertPEM(caCert)...)
}
return pemBytes
}
// GetCertUsages returns a slice of strings representing the certificate usages
func GetCertUsages(cert *x509.Certificate) []string {
usages := []string{}
if cert.KeyUsage&x509.KeyUsageCertSign != 0 {
usages = append(usages, CertUsageCertSign)
}
for _, eku := range cert.ExtKeyUsage {
switch eku {
case x509.ExtKeyUsageServerAuth:
usages = append(usages, CertUsageServerAuth)
case x509.ExtKeyUsageClientAuth:
usages = append(usages, CertUsageClientAuth)
}
}
if len(usages) == 0 {
usages = append(usages, CertUsageUnknown)
}
return usages
}
// GetCertStatus determines the status of a certificate based on its validity period
func GetCertStatus(cert *x509.Certificate, now time.Time, warn time.Time) string {
if now.Before(cert.NotBefore) {
return CertStatusNotYetValid
} else if now.After(cert.NotAfter) {
return CertStatusExpired
} else if warn.After(cert.NotAfter) {
return CertStatusWarning
}
return CertStatusOK
}