proxy-pool/internal/controlplane/tlsreload/identity.go

35 lines
1.2 KiB
Go

package tlsreload
import (
"crypto/tls"
"crypto/x509"
"errors"
"fmt"
"proxy-pool/internal/domain/workerruntime"
)
var ErrInvalidSPIFFEIdentity = errors.New("invalid SPIFFE workload identity")
// ResolveSPIFFEIdentity returns the logical Worker or Checker ID encoded in a
// role-specific SPIFFE URI SAN. It only accepts the exact identity shape that
// the Controller authorizer accepts for a control-plane request.
func ResolveSPIFFEIdentity(certificateFile, keyFile, trustDomain, environment, role string) (string, error) {
if certificateFile == "" || keyFile == "" || trustDomain == "" || environment == "" || (role != "worker" && role != "checker") {
return "", ErrInvalidSPIFFEIdentity
}
certificate, err := tls.LoadX509KeyPair(certificateFile, keyFile)
if err != nil || len(certificate.Certificate) == 0 {
return "", fmt.Errorf("%w: load client certificate", ErrInvalidSPIFFEIdentity)
}
leaf, err := x509.ParseCertificate(certificate.Certificate[0])
if err != nil {
return "", fmt.Errorf("%w: parse client certificate", ErrInvalidSPIFFEIdentity)
}
identity, ok := workerruntime.SingleSPIFFEIdentity(leaf.URIs, trustDomain, environment, role)
if !ok {
return "", ErrInvalidSPIFFEIdentity
}
return identity, nil
}