Ctrl K
ComunidadGuías…

pkg/certs/secret.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package certs

import (
	"bytes"
	"encoding/pem"
	"time"

	"github.com/skyhook-io/radar/pkg/topology"
	corev1 "k8s.io/api/core/v1"
)

// sealedSecretsKeyLabel marks a sealed-secrets controller keypair. Those are
// type=kubernetes.io/tls and parse as real (long-lived, self-signed) x509, but
// they're an internal encryption key, not a serving certificate anyone renews —
// so the certificate inventory skips them to stay signal, not noise.
const sealedSecretsKeyLabel = "sealedsecrets.bitnami.com/sealed-secrets-key"

// FromTLSSecret projects a kubernetes.io/tls secret into an Input.
// ok=false for secrets that aren't serving certs: non-TLS types, sealed-secrets
// controller keypairs (encryption keys, not renew-able certs), and secrets
// whose tls.crt is missing or unparseable. Reads only tls.crt — never tls.key.
func FromTLSSecret(sec *corev1.Secret) (Input, bool) {
	if sec.Type != corev1.SecretTypeTLS {
		return Input{}, false
	}
	if _, sealed := sec.Labels[sealedSecretsKeyLabel]; sealed {
		return Input{}, false
	}
	data := sec.Data["tls.crt"]
	start := bytes.Index(data, []byte("-----BEGIN CERTIFICATE-----"))
	if start < 0 {
		return Input{}, false
	}
	data = data[start:]
	endMarker := []byte("-----END CERTIFICATE-----")
	end := bytes.Index(data, endMarker)
	if end < 0 || bytes.Contains(data[len("-----BEGIN CERTIFICATE-----"):end], []byte("-----BEGIN CERTIFICATE-----")) {
		return Input{}, false
	}
	block, _ := pem.Decode(data[:end+len(endMarker)])
	if block == nil || block.Type != "CERTIFICATE" {
		return Input{}, false
	}
	// A malformed leaf must not promote an intermediate to the Secret's certificate.
	leaf := topology.ParsePEMCertificates(pem.EncodeToMemory(block))
	if len(leaf) == 0 {
		return Input{}, false
	}
	in := Input{
		Name:      sec.Name,
		Namespace: sec.Namespace,
		Issuer:    leaf[0].Issuer,
		Domains:   leaf[0].SANs,
		Source:    SourceTLSSecret,
	}
	if t, err := time.Parse(time.RFC3339, leaf[0].NotAfter); err == nil {
		in.NotAfter = &t
	}
	if t, err := time.Parse(time.RFC3339, leaf[0].NotBefore); err == nil {
		in.NotBefore = &t
	}
	return in, true
}