diff --git a/internal/resources/konnectivity/certificate_resource.go b/internal/resources/konnectivity/certificate_resource.go index 0442c7f..ade0636 100644 --- a/internal/resources/konnectivity/certificate_resource.go +++ b/internal/resources/konnectivity/certificate_resource.go @@ -5,6 +5,7 @@ package konnectivity import ( "context" + "crypto/x509" "fmt" "time" @@ -102,6 +103,16 @@ func (r *CertificateResource) mutate(ctx context.Context, tenantControlPlane *ka return func() error { logger := log.FromContext(ctx, "resource", r.GetName()) + // Retrieving the TenantControlPlane CA: + // this is required to trigger a new generation in case of Certificate Authority rotation. + namespacedName := k8stypes.NamespacedName{Namespace: tenantControlPlane.GetNamespace(), Name: tenantControlPlane.Status.Certificates.CA.SecretName} + secretCA := &corev1.Secret{} + if err := r.Client.Get(ctx, namespacedName, secretCA); err != nil { + logger.Error(err, "cannot retrieve the CA secret") + + return err + } + r.resource.SetLabels(utilities.MergeMaps( r.resource.GetLabels(), utilities.KamajiLabels(tenantControlPlane.GetName(), r.GetName()), @@ -119,23 +130,20 @@ func (r *CertificateResource) mutate(ctx context.Context, tenantControlPlane *ka isRotationRequested := utilities.IsRotationRequested(r.resource) if checksum := tenantControlPlane.Status.Addons.Konnectivity.Certificate.Checksum; !isRotationRequested && (len(checksum) > 0 && checksum == utilities.CalculateMapChecksum(r.resource.Data)) { + isCAValid, err := crypto.VerifyCertificate(r.resource.Data[corev1.TLSCertKey], secretCA.Data[kubeadmconstants.CACertName], x509.ExtKeyUsageServerAuth) + if err != nil { + logger.Info(fmt.Sprintf("certificate-authority verify failed: %s", err.Error())) + } + isValid, err := crypto.IsValidCertificateKeyPairBytes(r.resource.Data[corev1.TLSCertKey], r.resource.Data[corev1.TLSPrivateKeyKey], r.CertExpirationThreshold) if err != nil { logger.Info(fmt.Sprintf("%s certificate-private_key pair is not valid: %s", konnectivityCertAndKeyBaseName, err.Error())) } - if isValid { + if isCAValid && isValid { return nil } } - namespacedName := k8stypes.NamespacedName{Namespace: tenantControlPlane.GetNamespace(), Name: tenantControlPlane.Status.Certificates.CA.SecretName} - secretCA := &corev1.Secret{} - if err := r.Client.Get(ctx, namespacedName, secretCA); err != nil { - logger.Error(err, "cannot retrieve the CA secret") - - return err - } - ca := kubeadm.CertificatePrivateKeyPair{ Name: kubeadmconstants.CACertAndKeyBaseName, Certificate: secretCA.Data[kubeadmconstants.CACertName],