@@ -857,56 +857,43 @@ func (t *Translator) buildListenerTLSParameters(policy *egv1a1.ClientTrafficPoli
857857 }
858858
859859 for _ , caCertRef := range tlsParams .ClientValidation .CACertificateRefs {
860- caCertRefKind := string (ptr .Deref (caCertRef .Kind , resource .KindSecret ))
861- var caCertBytes []byte
862- switch caCertRefKind {
863- case resource .KindSecret :
864- secret , err := t .validateSecretRef (false , from , caCertRef , resources )
865- if err != nil {
866- return irTLSConfig , err
867- }
868-
869- secretCertBytes , ok := getCaCertFromSecret (secret )
870- if ! ok || len (secretCertBytes ) == 0 {
871- return irTLSConfig , fmt .Errorf (
872- "caCertificateRef secret [%s] not found" , caCertRef .Name )
873- }
874- caCertBytes = secretCertBytes
875- case resource .KindConfigMap :
876- configMap , err := t .validateConfigMapRef (false , from , caCertRef , resources )
877- if err != nil {
878- return irTLSConfig , err
879- }
880-
881- configMapData , ok := getCaCertFromConfigMap (configMap )
882- if ! ok || len (configMapData ) == 0 {
883- return irTLSConfig , fmt .Errorf (
884- "caCertificateRef configmap [%s] not found" , caCertRef .Name )
885- }
886- caCertBytes = []byte (configMapData )
887- case resource .KindClusterTrustBundle :
888- trustBundle := resources .GetClusterTrustBundle (string (caCertRef .Name ))
889- if trustBundle == nil {
890- return irTLSConfig , fmt .Errorf (
891- "caCertificateRef ClusterTrustBundle [%s] not found" , caCertRef .Name )
892- }
893- caCertBytes = []byte (trustBundle .Spec .TrustBundle )
894- default :
895- return irTLSConfig , fmt .Errorf ("unsupported caCertificateRef kind:%s" , caCertRefKind )
860+ caCertBytes , err := t .validateAndGetDataAtKeyInRef (caCertRef , caCertKey , resources , from )
861+ if err != nil {
862+ return irTLSConfig , fmt .Errorf ("failed to get certificate from ref: %w" , err )
896863 }
897-
898864 if err := validateCertificate (caCertBytes ); err != nil {
899- return irTLSConfig , fmt .Errorf (
900- "invalid certificate in %s %s: %w" , caCertRefKind , caCertRef .Name , err )
865+ return irTLSConfig , fmt .Errorf ("invalid certificate in %s: %w" , caCertRef .Name , err )
901866 }
902867 irCACert .Certificate = append (irCACert .Certificate , caCertBytes ... )
903868 }
904-
905869 if len (irCACert .Certificate ) > 0 {
906870 irTLSConfig .CACertificate = irCACert
907871 irTLSConfig .RequireClientCertificate = ! tlsParams .ClientValidation .Optional
908872 setTLSClientValidationContext (tlsParams .ClientValidation , irTLSConfig )
909873 }
874+
875+ irCrl := & ir.TLSCrl {
876+ Name : irTLSCrlName (policy .Namespace , policy .Name ),
877+ }
878+
879+ if tlsParams .ClientValidation .Crl != nil {
880+ for _ , crlRef := range tlsParams .ClientValidation .Crl .Refs {
881+ crlBytes , err := t .validateAndGetDataAtKeyInRef (crlRef , crlKey , resources , from )
882+ if err != nil {
883+ return irTLSConfig , fmt .Errorf ("failed to get crl from ref: %w" , err )
884+ }
885+ if err := validateCrl (crlBytes ); err != nil {
886+ return irTLSConfig , fmt .Errorf ("invalid crl in %s: %w" , crlRef .Name , err )
887+ }
888+ irCrl .Data = append (irCrl .Data , crlBytes ... )
889+ }
890+ if len (irCrl .Data ) > 0 {
891+ irTLSConfig .Crl = irCrl
892+ if tlsParams .ClientValidation .Crl .OnlyVerifyLeafCertificate != nil {
893+ irCrl .OnlyVerifyLeafCertificate = * tlsParams .ClientValidation .Crl .OnlyVerifyLeafCertificate
894+ }
895+ }
896+ }
910897 }
911898
912899 if tlsParams .Session != nil && tlsParams .Session .Resumption != nil {
@@ -921,6 +908,43 @@ func (t *Translator) buildListenerTLSParameters(policy *egv1a1.ClientTrafficPoli
921908 return irTLSConfig , nil
922909}
923910
911+ // validateAndGetDataAtKeyInRef validates the secret object reference and gets the data at the key in the secret or configmap
912+ func (t * Translator ) validateAndGetDataAtKeyInRef (ref gwapiv1.SecretObjectReference , key string , resources * resource.Resources , from crossNamespaceFrom ) ([]byte , error ) {
913+ refKind := string (ptr .Deref (ref .Kind , resource .KindSecret ))
914+ switch refKind {
915+ case resource .KindSecret :
916+ secret , err := t .validateSecretRef (false , from , ref , resources )
917+ if err != nil {
918+ return nil , err
919+ }
920+
921+ secretCertBytes , ok := getOrFirstFromData (secret .Data , key )
922+ if ! ok || len (secretCertBytes ) == 0 {
923+ return nil , fmt .Errorf ("ref secret [%s] not found" , ref .Name )
924+ }
925+ return secretCertBytes , nil
926+ case resource .KindConfigMap :
927+ configMap , err := t .validateConfigMapRef (false , from , ref , resources )
928+ if err != nil {
929+ return nil , err
930+ }
931+
932+ configMapData , ok := getOrFirstFromData (configMap .Data , key )
933+ if ! ok || len (configMapData ) == 0 {
934+ return nil , fmt .Errorf ("ref configmap [%s] not found" , ref .Name )
935+ }
936+ return []byte (configMapData ), nil
937+ case resource .KindClusterTrustBundle :
938+ trustBundle := resources .GetClusterTrustBundle (string (ref .Name ))
939+ if trustBundle == nil {
940+ return nil , fmt .Errorf ("ref ClusterTrustBundle [%s] not found" , ref .Name )
941+ }
942+ return []byte (trustBundle .Spec .TrustBundle ), nil
943+ default :
944+ return nil , fmt .Errorf ("unsupported ref kind:%s" , refKind )
945+ }
946+ }
947+
924948func setTLSClientValidationContext (tlsClientValidation * egv1a1.ClientValidationContext , irTLSConfig * ir.TLSConfig ) {
925949 if len (tlsClientValidation .SPKIHashes ) > 0 {
926950 irTLSConfig .VerifyCertificateSpki = append (irTLSConfig .VerifyCertificateSpki , tlsClientValidation .SPKIHashes ... )
0 commit comments